我们都知道,普通的类方法需要经过实例化对象后,才能调用使用
而经过@staticmethod和@classmethod装饰后的类方法这不需要实例化来调用,可以直接用类名来调用,类名.方法名(),但是也能够实例化后调用
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
区别:
@staticmethod不用表示自身对象的self参数,也不用表示自身类的cls参数,用法就像普通函数一样,调用类属性和方法时,用类名.属性名和类名.方法名()
@classmethond也没有表示自身对象的self参数,但是有一个表示自身类的参数cls,调用类属性和方法时,用cls.属性调用类属性,用cls().方法()调用类方法
class Base(object):
num = 1
def func(self):
print('abc')
@staticmethod
def static_func():
print('static_abc')
print(Base.num)
Base().func()
@classmethod
def class_func(cls):
print('class_abc')
print(cls.num)
cls().func()
Base.static_func()
Base.class_func()
a = Base()
a.func()
输出:
static_abc
1
abc
class_abc
1
abc
abc