天天看點

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