@classmethod装饰的方法为类方法,传入cls参数封装了类的信息的对象。可以直接用类名调用方法。
但是和@staticmethod装饰方法不同一点是。用@classmethod装饰的方法可以调用对象方法,当调用对像方法时调用对象打的初始化方法__init__。如果没调用对象方法则不创建对象。@classmethod装饰会创建一个对象,但会调用多次初始化方法。cls()等同于调用__init__(self)方法,返回self对象。根据__init__()的参数,传入cls()中的参数,每次返回一个对象,可以返回多个对象,如[cls(),cls(),cls()]。
class MyList(object): @classmethod def fun2(cls): print(cls()) #cls()方法返回self对象,所以调用初始化方法 #print(112)#只有调用对象方法才会调用初始化方法 print(type(cls)) cls().fun() def __init__(self): print(self) print('init') def fun(self): print(self)
返回结果:
<__main__.MyList object at 0x01C940F0> init <__main__.MyList object at 0x01C940F0> <class 'type'> <__main__.MyList object at 0x01C940F0> init <__main__.MyList object at 0x01C940F0>