python中@classmethod @staticmethod区别
Python中有3种方式定义类方法:
- 常规方式
- @classmethod修饰方式
- @staticmethod修饰方式
常规的类方法需要通过self参数隐式的传递当前类对象的实例,见如下代码:
class A(object):
def f(self, x):
print("executing foo(%s,%s)" % (self, x))
print('self:', self)
@classmethod修饰的方法class_f()需要通过cls参数传递当前类对象,见如下代码:
class A(object):
@classmethod
def class_f(cls, x):
print("executing class_foo(%s,%s)" % (cls, x))
print('cls:', cls)
@staticmethod修饰的方法static_f与C语言的普通函数是一样的,见如下代码:
class A(object):
@staticmethod
def static_f(x):
print("executing static_foo(%s)" % x)
self和cls的区别不是强制的,只是PEP8中一种编程风格,slef通常用作实例方法的第一参数,cls通常用作类方法的第一参数,即通常用self来传递当前类对象的实例,cls传递当前类对象。