一般来说,类的函数都需要实例化后,通过实例化对象来使用。就像这样:
这时候,使用@classmethod 和 @staticmethod 装饰器来装饰函数,就可以函数直接使用类名来调用。如:
例如上面的定义的类A,仔细会发现,在使用@classmethod装饰器时,第一个参数是返回类本身cls,不需要一般的类函数表示实例化对象的self。而使用@staticmethod装饰器时,是不需要self参数的,也不需要表示类本身的cls。
然后再使用这些函数时,便可以直接 类名.函数名 来调用,就不需要实例化,在类外调用时如:
而普通的类函数c,则只能通过实例化对象来调用。
而@classmethod 和 @staticmethod 的区别就是需要的参数:
@classmethod 需要 cls 参数,这个参数表示类本身,可以直接调用类的属性和方法。例:
@staticmethod 不需要任何参数,装饰为类本身的方法,做为类本身的方法可以在@classmethod 装饰的函数中利用cls.方法名 调用。例:
好好利用装饰器便可以方便代码结构,让代码更清晰可观。
class A(object): def a(self) print('a') s = A() s.a() >>>'a' (输出)
而有时候,在多个类中都会使用到相同的一些工具函数,或者在一个类中,有一个在别的函数中使用到的通用函数,那么这时候,如果每次使用都要实例化后再调用就太傻了,又造成多余的资源浪费。
class A(object): @classmethod def a(cls): print('a') @staticmethod def b(): print('b') def c(self): A.a() B.a()
例如上面的定义的类A,仔细会发现,在使用@classmethod装饰器时,第一个参数是返回类本身cls,不需要一般的类函数表示实例化对象的self。而使用@staticmethod装饰器时,是不需要self参数的,也不需要表示类本身的cls。
然后再使用这些函数时,便可以直接 类名.函数名 来调用,就不需要实例化,在类外调用时如:
A.a() A.b() S = A() S.c() >>>'a' >>>'b' >>>'a' >>>'b'
而普通的类函数c,则只能通过实例化对象来调用。
而@classmethod 和 @staticmethod 的区别就是需要的参数:
@classmethod 需要 cls 参数,这个参数表示类本身,可以直接调用类的属性和方法。例:
class A(object): name = 'a' @classmethod def A(cls): print(cls.name) #cls.name 则表示本身类的name属性
@staticmethod 不需要任何参数,装饰为类本身的方法,做为类本身的方法可以在@classmethod 装饰的函数中利用cls.方法名 调用。例:
class A(object): name = 'a' @staticmethod def b(): print('b') def c(self): print('c') @classmethod def A(cls): cls.b() # 调用类方法 b cls.c() ## 这个是不行的,普通的方法是实例方法,只能通过实例化对象来调用
好好利用装饰器便可以方便代码结构,让代码更清晰可观。