1. 靜態方法
如果我們的類屬性是一個私有變量,我們就需要定義一個函數使得在類外可以訪問它。我們希望既可以用類名來訪問,也可以用實例名來訪問,那么該如何做呢?
下面這樣是不行的:
class Robot: # __開頭表示私有變量 __counter = 0 def __init__(self): type(self).__counter += 1 def RobotInstances(self): return Robot.__counter if __name__ == "__main__": x = Robot() print("通過實例訪問: ", x.RobotInstances()) # 下面會報錯 print("通過類訪問: ", Robot.RobotInstances())
改代碼無法通過類名訪問,因為這種定義方式必須要定義一個實例,self指向這個實例。
如果我們在定義RobotInstances這個函數的時候,不寫self參數,那么可以通過類訪問,不能通過實例訪問,靜態方法就是為了解決這個問題。只需要在定義的函數前添加@staticmethod,這是裝飾器語法。
class Robot: # __開頭表示私有變量 __counter = 0 def __init__(self): type(self).__counter += 1 @staticmethod def RobotInstances(): return Robot.__counter if __name__ == "__main__": x = Robot() # 下面可以訪問 print("通過實例訪問: ", x.RobotInstances()) # 下面可以訪問 print("通過類訪問: ", Robot.RobotInstances())
2. 類方法與實例方法
class Robot: __counter = 0 def __init__(self): type(self).__counter += 1 @classmethod def RobotInstances(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信息,此時靜態方法無法起到作用,因為它沒有傳入任何參數,無法識別是哪一個類。
class Pet: _class_info = "pet animals" @classmethod def about(cls): print("This class is about " + cls._class_info + "!") class Dog(Pet): _class_info = "man's best friends" class Cat(Pet): _class_info = "all kinds of cats" Pet.about() Dog.about() Cat.about()
參考鏈接:
[1] https://www.python-course.eu/python3_class_and_instance_attributes.php