python3 @classmethod 和 @staticmethod 的区别
如果您将某个东西定义为classmethod,这可能是因为您打算从类而不是类实例中调用它。
定义类方法的几种方式:
- 常规方式 : 需要self隐士传递当前类对象的实例。
- @classmethod 装饰器修饰 :需要通过cls参数传递当前类对象
- @staticmethod 装饰器修饰 :与普通函数是一样
class A(object): def foo(self, x): print("executing foo(%s, %s)" % (self, x)) @classmethod def class_foo(cls, x): print("executing class_foo(%s, %s)" % (cls, x)) @staticmethod def static_foo(x): print("executing static_foo(%s)" % x)
a = A()
调用说明
#类中方法均可通过:对象实例.方法() 访问 a.foo(1) #executing foo(<__main__.A object at 0x0000000001E9B488>, 1) a.class_foo(2) #executing class_foo(<class '__main__.A'>, 2) a.static_foo(3) #executing static_foo(3) #@classmethod修饰方法调用: 类对象或对象实例调用 A.class_foo(4) #executing class_foo(<class '__main__.A'>, 4) a.class_foo(5) #executing class_foo(<class '__main__.A'>, 5) # 通过类对象 访问常规方法即没有修饰符的方法 A.foo(a,6) #executing foo(<__main__.A object at 0x000000000284C488>, 6)
其他案例:
class A(object): def __init__(self,name): self.name = name def foo(self, x): print("executing foo(%s, %s, %s)" % (self, x,self.name)) @classmethod def class_foo(cls, x): print("executing class_foo(%s, %s)" % (cls, x)) # 返回一个实例对象 return cls(x) @staticmethod def static_foo(x): print("executing static_foo(%s)" % x) dd = A.class_foo(2) # executing class_foo(<class '__main__.A'>, 2) print(dd.name) # 2 dd.foo(3) # executing foo(<__main__.A object at 0x0000000001E8B708>, 3, 2)
class CeShi: name = '测试' def __init__(self,x,y): self.x = x self.y = y @property #在CeShi_add函数前加上@property,使得该函数可直接调用,封装起来 def CeShi_add(self): return self.x + self.y #在CeShi_info函数前加上@classmethon,则该函数变为类方法, @classmethod #该函数只能访问到类的数据属性,不能获取实例的数据属性 def CeShi_info(cls): #python自动传入位置参数cls就是类本身 print('这是一个%s'%cls.name) #cls.CeShi_name调用类自己的数据属性 CeShi.CeShi_info()