1. 程式人生 > >python中的例項方法、靜態方法、類方法、私有方法和保護方法

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中類中的方法其實也是類屬性的一種(動態屬性),區別於類的靜態屬性的是方法可以有行參輸入。