靜態(tài)方法追城、類方法和類屬性
- 實(shí)例方法
- 語(yǔ)法:必須有一個(gè)參數(shù),這個(gè)參數(shù)表示當(dāng)前實(shí)例對(duì)象,一般是self
- 調(diào)用:只能通過(guò)實(shí)例對(duì)象調(diào)用
- 類方法
- 語(yǔ)法:必須有一個(gè)參數(shù),這個(gè)參數(shù)表示當(dāng)前類對(duì)象,一般是cls,在方法的頭部加注釋(裝飾器)@classmethod
- 調(diào)用:實(shí)例對(duì)象可以調(diào)用汰现,類對(duì)象也可以調(diào)用
- 靜態(tài)方法
- 語(yǔ)法:普通函數(shù)的格式,不需要強(qiáng)制的要求傳遞參數(shù),在方法的頭部加上注釋@staticmethod;一般用于與實(shí)例對(duì)象,類對(duì)象無(wú)關(guān)的內(nèi)容
- 實(shí)例方法掏觉、類方法、靜態(tài)方法都可以通過(guò)實(shí)例或者類調(diào)用值漫,只不過(guò)實(shí)例方法通過(guò)類調(diào)用時(shí)需要傳遞實(shí)例的引用
In [43]: class Test(object):
...: def instancefun(self): # 實(shí)例方法
...: print('instancefun')
...: print(self)
...: @classmethod
...: def classfun(cls): # 類方法
...: print('classfun')
...: print(cls)
...: @staticmethod
...: def staticfun(): # 靜態(tài)方法
...: print('staticfun')
...: def function(): # 普通函數(shù)
...: print('func')
...:
In [44]: t = Test() # 實(shí)例化一個(gè)的對(duì)象
In [45]: t.instancefun()
instancefun
<__main__.Test object at 0x7f99fc879510>
In [46]: Test.classfun() # 類調(diào)用類方法
classfun
<class '__main__.Test'>
In [47]: t.classfun() # 對(duì)象調(diào)用類方法
classfun
<class '__main__.Test'>
In [48]: Test.staticfun() # 類調(diào)用靜態(tài)方法
staticfun
In [49]: t.staticfun() # 對(duì)象調(diào)用靜態(tài)方法
staticfun
In [50]: Test.instancefun(t) # 類調(diào)用實(shí)例方法需要傳遞參數(shù)
instancefun
<__main__.Test object at 0x7f99fc879510>
- 實(shí)例屬性
- 實(shí)例屬性是對(duì)象持有的澳腹,不是共享的屬性
- 實(shí)例屬性只有對(duì)象能夠訪問(wèn)
- 類屬性
- 定義在類內(nèi)部,方法的外部的屬性就是類屬性
- 在類的外部,通過(guò)類對(duì)象.屬性就是類屬性
- 實(shí)例屬性和類屬性的區(qū)別
- 類屬性歸所有的實(shí)例對(duì)象共享遵湖,可以通過(guò)類名訪問(wèn),也可以通過(guò)實(shí)例來(lái)訪問(wèn)
- 實(shí)例屬性歸具體某個(gè)實(shí)例對(duì)象所有晚吞,只能通過(guò)實(shí)例對(duì)象訪問(wèn)
# 類屬性
In [55]: class Person(object):
...: num = 100
...: def __init__(self):
...: self.name = "zzz"
...: def func(self):
...: self.age = 100
...:
In [56]: p1 = Person()
In [57]: p1.name = "aaa" # 通過(guò)實(shí)例化對(duì)象修改屬性延旧,發(fā)現(xiàn)屬性并沒(méi)有修改
In [58]: p2 = Person()
In [59]: print(p1.name)
aaa
In [60]: print(p2.name)
zzz
In [61]: Person.num = 200 # 通過(guò)類對(duì)象修改屬性,發(fā)現(xiàn)屬性修改了
In [62]: print(p1.num)
200
In [63]: print(p2.num)
200
- 如果需要在類外修改屬性槽地,必須通過(guò)類對(duì)象去引用然后進(jìn)行修改迁沫;如果通過(guò)實(shí)例對(duì)象去引用,會(huì)產(chǎn)生一個(gè)同名的實(shí)例屬性捌蚊,這種方式修改的是實(shí)例屬性集畅,不會(huì)影響到類屬性,并且之后如果通過(guò)實(shí)例對(duì)象去引用 該名稱的屬性缅糟,實(shí)例屬性會(huì)強(qiáng)制屏蔽掉類屬性挺智,即引用的是實(shí)例屬性,除非刪除該實(shí)例屬性窗宦;
- 類中私有屬性
- __private_attrs:兩個(gè)下劃線開(kāi)頭赦颇,聲明該屬性為私有,不能在類的外部被使用或直接訪問(wèn)
- 在類內(nèi)部的方法中使用時(shí) self.__private_attrs
-
訪問(wèn)私有屬性其格式是:對(duì)象.類_字段名赴涵;
- eg:Test._Test__name或者a._Test__name
In [85]: class Test:
...: __name = 'aaa'
...: def a(self):
...: print Test.__name
...:
In [86]: a = Test()
In [87]: a.a()
aaa
In [88]: print Test.__name # 不能直接訪問(wèn)私有屬性
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-88-56cfd6a10fe4> in <module>()
----> 1 print Test.__name
AttributeError: class Test has no attribute '__name'
In [89]: print a._Test__name # 通過(guò)實(shí)例對(duì)象進(jìn)行訪問(wèn)/也可以通過(guò)類對(duì)象進(jìn)行訪問(wèn)
aaa