装饰器的进阶_1
装饰器的复习
def wrapper(func): def inner(*args,**kwargs): print('引用前要做的事') ret=func(*args,**kwargs) print('引用后要做的事') return ret return inner @wrapper#实际上就等价于holiday=wrapper(holiday) def holiday(day): print('放假%s天'%day) return '很开心' ret=holiday(3)#注意ret这里所承接的内容是第12行代码的返回值 print(ret)
装饰器的执行过程:装饰
上面那段代码的执行顺序
对上段代码自己的理解
1 #先构造一个装饰器的闭包 2 3 def wrapper(): 4 def inner(*args,**kwargs): 5 print('前') 6 # ret=func(*args,**kwargs) 7 print('后') 8 # return ret 9 return inner 10 11 wrapper()() 12 13 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py 14 前 15 后 16 17 Process finished with exit code 0
进一步改进
1 def wrapper(func): 2 def inner(*args,**kwargs): 3 print('前') 4 ret=func(*args,**kwargs) 5 print('后') 6 return ret 7 return inner 8 9 @wrapper #func=wrapper(func) 10 def holiday(day): 11 print('放假%s天'%day) 12 return '很开心' 13 14 inn=holiday(3)#注意等号右边的holiday(3)就相当于inner(3) 15 print(inn) 16 17 18 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py 19 前 20 放假3天 21 后 22 很开心 23 24 Process finished with exit code 0
第22行的很开心是第6行和第12行代码的综合结果,第12行返回‘很开心“,然后第6行的return再把’很开心‘这行代码返回给第14行的inn,第15行执行出结果,所以第6行和第12行代码缺一不可,否则就会报none
延申
def outer(*args): print(args) #print(*args) outer(1,2,3,4) outer(*[1,2,3,4]) outer(*(1,2,3,4)) #三个结果完全相同
延申进阶
def outer(*args): print(args) print(*args) def inner(*args): print('inner:',args) inner(*args) outer(1,2,3,4) #三个结果完全相同 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/456.py (1, 2, 3, 4) 1 2 3 4 inner: (1, 2, 3, 4) Process finished with exit code 0
新的知识点
def wahaha(): ''' 一个打印哇哈哈的函数 :return: ''' print('哇哈哈') print(wahaha.__name__)#打印出函数的字符串名称 print(wahaha.__doc__)#打印出函数的注释
同理将这个新的知识点应用到上面的代码中
1 def wrapper(func): 2 def inner(*args,**kwargs): 3 print('前') 4 ret=func(*args,**kwargs) 5 print('后') 6 return ret 7 return inner 8 9 @wrapper #func=wrapper(func) 10 def holiday(day): 11 print('放假%s天'%day) 12 return '很开心' 13 14 print(holiday.__name__) 15 16 17 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py 18 inner 19 20 Process finished with exit code 0
由于holiday在代码中实际上指代的是inner,所以打印出来的结果就是inner
再进阶
1 from functools import wraps 2 def wrapper(func): 3 @wraps(func)#加上一个内置的装饰器,但是注意这里的装饰器里面含有参数 4 def inner(*args,**kwargs): 5 print('前') 6 ret=func(*args,**kwargs) 7 print('后') 8 return ret 9 return inner 10 11 @wrapper #func=wrapper(func) 12 def holiday(day): 13 '''这是一个放假的通知''' 14 print('放假%s天'%day) 15 return '很开心' 16 17 print(holiday.__name__)#加上内置的装饰器以后,打印出来的结果就是holiday本身了 18 print(holiday.__doc__) 19 20 inn=holiday(3)#注意等号右边的holiday(3)就相当于inner(3) 21 print(inn) 22 23 24 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py 25 holiday 26 这是一个放假的通知 27 前 28 放假3天 29 后 30 很开心 31 32 Process finished with exit code 0
通过调用python内置的装饰器,打印出了holiday