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
来源:https://www.cnblogs.com/yunxiaofei/p/11210240.html