装饰器有什么作用呢?比如我之前定义了一个函数,现在我想给它新增加一些功能,如果直接改动函数,会影响一些用户的使用,这时就用到了装饰器
显著标志:@
@标注在用于装饰的函数上面
比如我想给一个函数调用前后分别打印日志
def log(f):
def wrap(*args,**kwargs):
print('call %s()'% f.__name__)
f(*args,**kwargs)
print('finish %s()'% f.__name__)
return wrap
@log
def now():
print('2018-5-1')
now()
这里的@log就相当于now=log(now)
执行now就是执行def log(f)这个函数了,再加上(),执行里层的def wrap()
如果装饰器本身需要参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂
import functools
def log(text):
def deco(f):
@functools.wraps(f)
def wrap(*args,**kw):
print('call %s()'% f.__name__)
f()
print('finish %s %s()' %(text,f.__name__))
return wrap
return deco
@log('execute') #相当于 now=log('execute')(now)
def now():
print('2018-5-1')
now()