天天看點

python靜态方法_python靜态方法、類方法和執行個體方法

1. 靜态方法

如果我們的類屬性是一個私有變量,我們就需要定義一個函數使得在類外可以通路它。我們希望既可以用類名來通路,也可以用執行個體名來通路,那麼該如何做呢?

下面這樣是不行的:

classRobot:#__開頭表示私有變量

__counter =0def __init__(self):

type(self).__counter += 1

defRobotInstances(self):return Robot.__counter

if __name__ == "__main__":

x=Robot()print("通過執行個體通路:", x.RobotInstances())#下面會報錯

print("通過類通路:", Robot.RobotInstances())

改代碼無法通過類名通路,因為這種定義方式必須要定義一個執行個體,self指向這個執行個體。

如果我們在定義RobotInstances這個函數的時候,不寫self參數,那麼可以通過類通路,不能通過執行個體通路,靜态方法就是為了解決這個問題。隻需要在定義的函數前添加@staticmethod,這是裝飾器文法。

classRobot:#__開頭表示私有變量

__counter =0def __init__(self):

type(self).__counter += [email protected]():return Robot.__counter

if __name__ == "__main__":

x=Robot()#下面可以通路

print("通過執行個體通路:", x.RobotInstances())#下面可以通路

print("通過類通路:", Robot.RobotInstances())

2. 類方法與執行個體方法

classRobot:__counter =0def __init__(self):

type(self).__counter += [email protected](cls):return cls, Robot.__counter

if __name__ == "__main__":print(Robot.RobotInstances())

x=Robot()print(x.RobotInstances())

y=Robot()print(x.RobotInstances())print(Robot.RobotInstances())

使用類方法不需要定義一個執行個體,類方法中的cls指向類,不像執行個體方法中的self指向一個執行個體。定義類方法,需要在函數前添加@classmethod裝飾器。

3. 類方法的應用案例

類方法在繼承當中很有用,在如下代碼中,我們希望在不定義執行個體的情況下,可以檢視_class_info資訊,此時靜态方法無法起到作用,因為它沒有傳入任何參數,無法識别是哪一個類。

classPet:

_class_info= "pet animals"@classmethoddefabout(cls):print("This class is about" + cls._class_info + "!")classDog(Pet):

_class_info= "man's best friends"

classCat(Pet):

_class_info= "all kinds of cats"Pet.about()

Dog.about()

Cat.about()

參考連結:

繼續閱讀