python靜態方法、類方法和實例方法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM