参考链接:https://foofish.net/python-decorator.html
python装饰器可以装饰一个函数。它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。
如果直接将函数作为参数传入到另外一个函数中。
def use_logging(func):
logging.warn("%s is running" % func.__name__)
func()
def foo():
print('i am foo')
use_logging(foo)
功能是实现了,但是我们调用的时候不再是调用真正的业务逻辑 foo 函数,而是换成了 use_logging 函数,这就破坏了原有的代码结构, 现在我们不得不每次都要把原来的那个 foo 函数作为参数传递给 use_logging 函数
因此更好的解决办法是使用装饰器。
def use_logging(func):
def wrapper():
logging.warn("%s is running" % func.__name__)
return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
return wrapper
def foo():
print('i am foo')
foo = use_logging(foo) # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于 foo = wrapper
foo() # 执行foo()就相当于执行 wrapper()
装饰器 @语法糖
下面这个代码与上面的代码是等效的。但是更加简洁明了
def use_logging(func):
def wrapper():
logging.warn("%s is running" % func.__name__)
return func()
return wrapper
@use_logging
def foo():
print("i am foo")
foo()
python常用的内置装饰器
参考:https://blog.youkuaiyun.com/chenzao123/article/details/79422002
基本用法:
@staticmethod是类静态方法,调用的时候不需要People(…).print_hello(“world”)
@classmethod调用的时候也不需要实例化,但是第一个参数必须是cls
@property将类方法变为一个只读的类属性
用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
例如上面print_hello()是类里面的函数,但是不需要类的参数参与。
self和cls区别
普通的方法,第一个参数需要是self,它表示一个具体的实例本身。
如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。
而对于classmethod,它的第一个参数不是self,是cls,它表示这个类本身。
也就是说普通的方法,类里面的函数后面都有self,self表示具体的实例本身
对于staticmethod装饰器,函数参数里面self和cls都可以没有
对于classmethod装饰器,函数第一个参数为cls,表示这个类本身