執行個體方法:
執行個體方法顧名思義就是執行個體對象調用的方法,是最普遍最常用的類中的方法:
class animal(object):
def __init__(self):
pass
def talk(self):
print("in animal talk")
dog=animal()
dog.talk() #方法1
animal.talk(dog) #方法2
執行個體方法的調用有兩種形式,但都是先将類執行個體化。方法1是最常見的,先定義一個dog執行個體,再通過dog執行個體調用animal類中的執行個體方法。方法2原理同方法1,talk方法中的self形參傳遞的其實就是執行個體本身,既也相當于定義了一個dog執行個體。
靜态方法:
靜态方法是類中的函數,不需要執行個體。靜态方法主要是用來存放邏輯性的代碼,主要是一些邏輯屬于類,但是和類本身沒有互動,即在靜态方法中,不會涉及到類中的方法和屬性的操作。可以了解為将靜态方法存在此類的名稱空間中。事實上,在python引入靜态方法之前,通常是在全局名稱空間中建立函數。
class animal(object):
def __init__(self):
pass
@staticmethod
def talk():
print("in animal talk")
dog=animal()
dog.talk()
animal.talk()
可以看見靜态方法不包含self形參,既不通過執行個體化也能調用,當然通過執行個體也能調用。一般靜态方法用來處理類中的邏輯判斷或者運算。
類方法:
類方法是将類本身作為對象進行操作的方法。他和靜态方法的差別在于:不管這個方式是從執行個體調用還是從類調用,它都用第一個參數把類傳遞過來。
class A(object):
def __init__(self,str):
print(str)
@classmethod
def link_str(cls,*args):
"""
将string字元串組合
:param args:strs
:return:str
"""
temp_tuple = args
result = ""
for i in range(len(temp_tuple)):
result = result + temp_tuple[i]
return cls(result)
obj_1=A("aa")
obj_2=A.link_str("aa","bb","cc") #相當于obj_2=A(link_str())
運作結果如下所示:
aa
aabbcc
可以看到class A中,當執行個體化A時都會print 輸入的string,正常執行個體化obj_1,輸出”aa“,如果我輸入的參數有多個,或者說我輸入參數是不同類型的,需要先對輸入參數進行預處理,那麼我們就可以通過類方法去實作。可以看見輸入“aa”,“bb”,“cc”三個string,先通過link_str對輸入的三個參數進行組合,将組合後的string作為A中init執行個體化的參數傳入。
私有方法
隻能允許這個類本身進行通路了,連子類也不可以用于命名一個類屬性(類變量),調用時名字被改變(在類FooBar内部,__boo變成_FooBar__boo,如self._FooBar__boo)
class A(object):
def __init__(self):
print("in __init__")
self.__private()
def __private(self):
print("in__private__")
class B(A):
pass
print(A.__dict__) #檢視類的屬性(類中方法也是類的屬性)
結果如下:
{'__module__': '__main__', '__init__': <function A.__init__ at >, '_A__private': <function A.__private at >, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
如果在一個方法前面加上了”_”那麼這個方法就變為了這個類私有方法,在運作結果中找不到__private這個方法,隻找到了_A__private,python其實這個方法名上加上了”類名”,所有當我們之間調用時會出現找不到該屬性的錯誤。私有方法一般隻在類内部進行調用。如果想要在類外強制調用那麼可以通過調用_A__private這個方法來調用(一般不建議強制調用)
保護方法:
保護方法很好了解就是以單下劃線開頭的表示的是 protected 類型的變量,即保護類型隻能允許其本身與子類進行通路,不能用于 from module import *。很好的展現面向對象程式設計的封裝,繼承兩大特性。
python中類中的方法其實也是類屬性的一種(動态屬性),差別于類的靜态屬性的是方法可以有行參輸入。