python中的@staticmethod与@classmethod
@classmethod
把一个方法封装成类方法。
class C:
@classmethod
def fun(cls, arg1, arg2, arg3, …): …
一个类方法把类自己作为第一个参数(cls),就像一个实例方法把实例自己作为第一个实参。
@staticmethod
把一个函数封装成类的静态函数,可以不需要实例化直接类名.方法名()来调用。
class B:
@staticmethod
def fun(arg1, arg2, arg3, …): …
@classmethod与@staticmethod这样的形式称为函数装饰器(decorator)
decorator – 装饰器
返回值为另一个函数的参数, 通常使用@wrapper语法形式来进行函数变换。装饰器的常见例子包括classmethod()和staticmethod()。
两者的区别
- @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
- @classmethod不需要self参数,但是第一个参数需要是表示自身类的cls参数。
- @staticmethod中要调用到这个类的一些属性方法,只能通过类名.属性名或类名.方法名。
- @classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等。