python静态方法、类方法和实例方法

天大地大妈咪最大 提交于 2020-02-25 07:26:01

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!