装饰器

例子一:

 1 import time
 2 def timer(func):
 3     def inner():
 4         ret = func()        #3、此处执行func1(),打印func1
 5         print(time.time())  #4、打印当前时间
 6         return ret          #5、返回func1的返回值
 7     return inner
 8 
 9 @timer              #1、此处执行 func1 = timer(func1) ,相当于func1 = inner
10 def func1():
11     print('func1')
12     return 'fun1 return'
13 print(func1())      #2、此处执行func1()=执行inner()  6、接收返回值并进行打印
14 
15 @timer
16 def func2():
17     print('func2')
18 func2()

以上执行结果:

1 func1
2 1548158473.1767523
3 fun1 return
4 func2
5 1548158473.1767523

例子二:  内部函数可以接收多个值

 1 def download(func):
 2     def inner(*args, **kwargs):
 3         print('下载软件')
 4         ret = func(*args, **kwargs)    #此处可接受多个值
 5         return ret
 6     return inner
 7 
 8 @download       #1、此处相当于执行 yue = download(yue)
 9 def yue(tool):
10     print("用{}传消息".format(tool))
11 
12 yue('QQ')       # 2、此处执行inner
13 yue('微信')
14 yue('FTP')

执行结果:

1 下载软件
2 用QQ传消息
3 下载软件
4 用微信传消息
5 下载软件
6 用FTP传消息

例子三:接收多个参数的装饰器

 1 import time
 2 flag = True
 3 def outer(flag):
 4     def timer(func):
 5         def inner(*args, **kwargs):
 6             ret = func(*args, **kwargs)   #打印func1
 7             if flag:
 8                 print(time.time())  
 9             return ret
10         return inner
11     return timer
12 
13 @outer(True)       # func1 = outer(True)(func1)   #@outer(True) == @timer  相当于 func1 = timer(func1) inner
14 def func1():
15     print('func1')
16 func1()          # 相当于执行timer

例子四:  一个函数利用多个装饰器

 1 def wrapper1(func):
 2     def inner(*args, **kwargs):
 3         print('wrapper1 前')  #6、直接打印
 4         ret = func(*args, **kwargs) #7、执行func1中的 打印出func1
 5         print('wrapper1 后')   #8 直接打印
 6         return ret
 7     return inner  # 2、把inner返回给func1
 8 
 9 def wrapper2(func):
10     def inner(*args, **kwargs):
11         print('wrapper2 前')   #4、直接打印
12         ret = func(*args, **kwargs)  #5、执行wrapper1中inner
13         print('wrapper2 后')   #9直接打印
14         return ret  
15     return inner
16 
17 @wrapper2   #2、相当于执行func1 = wrapper2(func) wrapper2.inner  #此时传的func是经过wrapper1装饰的
18 @wrapper1   #1、相当于执行func1 = wrapper1(func1) wrapper1.inner
19 def func1():
20     print('func1')
21 func1()   #3、此刻先执行wrapper2 中的inner 

例子五:  显示函数原有的名字

 1 from functools import wraps
 2 def w1(func):
 3     @wraps(func)  #相当于把每一个传进来的函数的名字进行还原/ 还能显示函数的本质
 4     def inner(*args, **kwargs):
 5         print('wrapper1 前')
 6         ret = func(*args, **kwargs)
 7         print('wrapper1 后')
 8         return ret
 9     return inner
10 
11 @w1
12 def func1():
13     """
14     xxxxxxxx
15     :return:
16     """
17     print('func1')
18 
19 @w1
20 def func2():
21     print('func2')
22 
23 print(func1.__doc__)    #打印出函数体内注释的内容
24 print(func2.__name__)   #打印函数的名字

 

posted @ 2019-01-23 00:04  小萍瓶盖儿  阅读(133)  评论(0)    收藏  举报