前言
本文主要介绍类方法。
一、类方法
关键字:@classmethod
@classmethod
def study(cls):
pass
类中的普通方法与类方法的区别
- 类方法上有关键字@classmethod
- 类方法的参数为(cls),普通方法参数为(self)
- 普通方法的调用需要创建对象,类方法可以不用创建对象,直接使用类进行调用。
分析代码
# 类方法
class Person:
age = 18 # 类属性
def __init__(self, name):
self.name = name # 对象属性
def read(self):
print("{}正在读书...".format(self.name))
@classmethod
def study(cls):
print('*********输出类名*************')
print(cls)
print('*********输出类属性*************')
print(cls.age)
print('*********输出对象属性*************')
# print(cls.name) #报错
wang = Person('wang') #创建对象
print("-----------调用类中的普通方法——-----------")
wang.read()
print("-----------调用类方法——-----------")
wang.study()
print("-----------使用类名调用类方法——-----------")
Person.study()
运行结果
-----------调用类中的普通方法——-----------
wang正在读书...
-----------调用类方法——-----------
*********输出类名*************
<class '__main__.Person'>
*********输出类属性*************
18
*********输出对象属性*************
-----------使用类名调用类方法——-----------
*********输出类名*************
<class '__main__.Person'>
*********输出类属性*************
18
*********输出对象属性*************
首先创建了一个Person类,程序运行首先给这个类开辟空间,类中包括__init__()方法,普通方法和类方法,分别定义了类属性和对象属性。
程序运行到创建对象wang,会给对象开辟空间,运行__init__()方法,对象会得到name和age属性,但这两个属性的创建也有所不同,不作详述。
创建完对象后,使用对象调用了普通方法read,这比较简单,就是基本的调用,执行方法后打印。read方法的参数self就是这个对象。
然后使用对象调用类方法,也没有问题,可以看到打印的类就是Person的类名。然后在类方法中调用了两个属性,类属性和对象属性,可以正常调用类属性,但无法调用对象属性。这是因为在创建类时开辟的那块空间里并没有name属性,这个属性是后来开辟对象空间执行__init__()方法时创建的,所以使用cls.name是找不到该属性的。所以会报错。
多说一句,在上述的程序中,类方法和普通方法的参数分别是cls和self,在这个小程序里self就等于wang这个对象,cls等于Person这个类。
最后是类方法的特殊用法,可以在不创建对象的情况下,直接使用类名进行调用。