python @classmethod和@staticmethod 装饰器使用

一般来说,类的函数都需要实例化后,通过实例化对象来使用。就像这样:
class A(object):
	def a(self)
		print('a')
s = A()
s.a()
>>>'a' (输出)

而有时候,在多个类中都会使用到相同的一些工具函数,或者在一个类中,有一个在别的函数中使用到的通用函数,那么这时候,如果每次使用都要实例化后再调用就太傻了,又造成多余的资源浪费。

这时候,使用@classmethod 和 @staticmethod 装饰器来装饰函数,就可以函数直接使用类名来调用。如:

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()  ## 这个是不行的,普通的方法是实例方法,只能通过实例化对象来调用


 
  好好利用装饰器便可以方便代码结构,让代码更清晰可观。

猜你喜欢

转载自blog.csdn.net/weixin_41004350/article/details/78780624