python中的例項方法、靜態方法、類方法、私有方法和保護方法
例項方法:
例項方法顧名思義就是例項物件呼叫的方法,是最普遍最常用的類中的方法:
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 0x0000019E1FEDB730>, '_A__private': <function A.__private at 0x0000019E1FEDB7B8>, '__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中類中的方法其實也是類屬性的一種(動態屬性),區別於類的靜態屬性的是方法可以有行參輸入。