首先和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法、实例方法和静态方法。
和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod
修饰的方法为类方法;采用 @staticmethod
修饰的方法为静态方法;不用任何修改的方法为实例方法。
静态方法
静态方法使用指南
- 格式:在方法上面添加 @staticmethod
- 参数:静态方法可以有参数也可以无参数
- 应用场景:一般用于和类对象以及实例对象无关的代码。
- 使用方式: 类名.类方法名(或者对象名.类方法名)。
如果我们的类属性是一个私有变量,我们就需要定义一个函数使得在类外可以访问它。我们希望既可以用类名来访问,也可以用实例名来访问,那么该如何做呢?
class Robot:
# __开头表示私有变量
__counter = 0
def __init__(self):
type(self).__counter += 1
def Show(self):
return Robot.__counter
if __name__ == "__main__":
x = Robot()
print("通过实例访问: ", x.Show())
print("通过类访问: ", Robot.Show()) # 这样访问会报错
如果我们在定义Show这个函数的时候,不写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())
类方法
类方法使用指南
无需实例化,可以通过类直接调用的方法,但是方法的第一个参数接收的一定是类本身
- 在方法上面添加
@classmethod
- 方法的参数为 cls 也可以是其他名称,但是一般默认为cls
- cls 指向 类对象
- 应用场景:使用场景:一个实例的私有属性通过“__属性名”来定义,无法被外部所访问。但是可以从类的内部进行间接访问,即通过实例方法来访问。
- 使用 可以是 对象名.类方法名。或者是 类名.类方法名
使用类方法不需要定义一个实例,类方法中的cls指向类,不像实例方法中的self指向一个实例。定义类方法,需要在函数前添加@classmethod
装饰器。
类方法在继承当中很有用,在下面的例子中,我们希望在不定义实例的情况下,可以查看_class_info
信息,此时静态方法无法起到作用,因为它没有传入任何参数,无法识别是哪一个类。
class Person:
type = '人类'
@classmethod
def test(cls):
print(cls.type)
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"
if __name__ == "__main__":
Pet.about()
Dog.about()
Cat.about()
Person.test()