一、简介
当我们想要增强某个函数的功能的时候,但又不希望修改函数的内容,这种情况就称之为装饰器decorator。
二、基础:
print(f())
def now():
return ('2015-06')
f = now
print(f())
结果:
2015-06
1.函数也是一个对象,而且函数对象可以赋值给变量,同样我们通过调用变量也能调用该函数
def log(func):#1.可以接收一个变量或者函数,如下面的now函数
def warpper(*args,**kw): #3.定义warpper,关键字参数,接收任意个参数
print('call %s():' %func.__name__) #4.打印日志:返回func变量的函数名字:now
return func(*args,**kw) #5.返回func指向的函数now。
return warpper
#2.log函数返回了warpper函数。而warpper带有参数和变量即称为闭包
@log
#now = log(now)
#接收now为函数返回新now
# 新的now 是指能打印日志的的就的now即原始输出日期的
def now():
print('2017-04-25')
print(log(now))
#可以看出log函数的确返回了warpper函数
print(now())
结果:
<function log.<locals>.warpper at 0x000001F07541CEA0>
call now():
2017-04-25
None
#为什么会有个none
def log(text): #2传入now 函数
def docorator(func): #4调用返回的函数docortor,参数是now函数
def wrapper(*args,**kw):#6调用返回函数wrapper,参数是('execute')(now)
print('%s %s():' % (text,func.__name__)) #打印execute now():
return func(*args,**kw)#返回旧now函数
return wrapper #5返回wrapper
return docorator #3返回docoratoe,
@log('execute')#1
now = log('execute')(now)
三层嵌套
def now():
print('2017-03-25')
print(now.__name__)
#print(log(now))
print(now())
functools.warps
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print('2017-03-25')
print(now())
print(now.__name__)