装饰器的进阶_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

 

 

 

 

posted @ 2019-01-19 23:03  舒畅123  阅读(83)  评论(0编辑  收藏  举报