如果您将某个东西定义为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() #executing foo(<__main__.A object at 0x0000000001E9B488>, )
a.class_foo() #executing class_foo(<class '__main__.A'>, )
a.static_foo() #executing static_foo() #@classmethod修饰方法调用: 类对象或对象实例调用
A.class_foo() #executing class_foo(<class '__main__.A'>, )
a.class_foo() #executing class_foo(<class '__main__.A'>, ) # 通过类对象 访问常规方法即没有修饰符的方法
A.foo(a,) #executing foo(<__main__.A object at 0x000000000284C488>, )
其他案例:
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) #
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()