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