装饰器进阶

---恢复内容开始---

装饰器的形成的过程:最简单的装饰器,有返回值,有一个参数,万能参数

装饰器的作用----不想修改函数的调用方式,但是还想再原来的函数前后添加功能

装饰器的原则-----开放封闭式原则:开放--对外是开放的    封闭---对修改的是封闭的

1)最简单的装饰器
import time   --------别人已经写好的一个方法,就是返回1970到现在的秒数
def wrapper(f):            --------装饰器函数    f是被装饰器的函数
    def inner():             -------- 内部函数,形成一个闭包
       ra= time.time()    -------- 返回当前的秒数
       f()                        -------- 被装饰器函数
       ba= time.time()   -------返回当前秒数
       print(ba-ra)          -------计算程序需要多少时间运行
    return inner            --------函数也是可以用于返回值的
@wrapper                   --------语法糖    @函数装饰器
def fun():                    --------被装饰器函数
    time.sleep(2)          ---------停顿2秒,在执行下面程序
    print('123')
fun()                          --------相当于==inner 因为@wrapper 相当于
                                            fun=wraaper(fun)
2)有返回值的装饰器
 1 import time
 2 def wrapper(f):
 3     def inner():
 4        ra= time.time()
 5        ret = f()   -----因为被装饰器有返回值,所以需要返回值接受
 6        ba= time.time()
 7        print(ba-ra)
 8        return ret   --------返回值
 9     return inner
10 @wrapper
11 def fun():
12     time.sleep(2)
13     print('123')
14     return '你好吗'
15 ret = fun()
16 print(ret)
3)万能参数
 1 import time
 2 def wrapper(f):
 3     def inner(*args,**kwargs):----因为fun相当于inner那么里面也要有参数
 4        ra= time.time()
 5        ret = f(*args,**kwargs)-------万能参数,无敌
 6        ba= time.time()
 7        print(ba-ra)
 8        return ret
 9     return inner
10 @wrapper
11 def fun(a,b=2):
12     time.sleep(2)
13     print('123')
14     return '你好吗'
15 ret = fun(2,4)
16 print(ret)
 4)wraps用法
 1 from functools import  wraps
 2 def wrapper(f):
 3     @wraps(f)
 4     def inner(*args, **kwargs):
 5         print('快放假了')
 6         ret = f(*args, **kwargs)
 7         print('真的放假了')
 8         return ret
 9 
10     return inner
11 
12 
13 @wrapper
14 def fun(day):
15     """
16      放假通知
17     """
18     print('还有%s天放假' % day)
19     return '好快心啊'
20 
21 print(fun.__name__)
22 print(fun.__doc__)
23 ra = fun(3)
24 print(ra)
 5)带参数的装饰器,用于如果你有多个被装饰的函数,哪些不要用的,判断一下即可
 1 import time
 2 FLAGE = False
 3 def wrapper_na(FLAGE): 
 4     def wrapper(f):
 5         def inner(*args, **kwargs):
 6             if FLAGE:
 7                 an = time.time()
 8                 ret = f(*args, **kwargs)
 9                 ba = time.time()
10                 print(ba - an)
11                 return ret
12             else:
13                  ret = f(*args, **kwargs)
14                  return ret
15         return inner
16     return wrapper
17 
18 
19 @wrapper_na(FLAGE) ---这个相当于 @==fun == wrapper(fun)  然后 wrapper=wrapper_na(flage) 
20 def fun(a, b):
21     time.sleep(2)
22     print('大家好')
23     return '你好'
24 @wrapper_na(FLAGE)
25 def fun1(a,b):
26     time.sleep(3)
27     print('好好好')
28     return '大集合'
29 
30 ret = fun(1, 2)
31 print(ret)
32 
33 ret1 = fun1(1,32)
34 print(ret1)
6)多个装饰器装饰一个函数
 1 def wrapper1(f):
 2     def inner():
 3         print('你好1')
 4         f()
 5         print('很好1')
 6     return inner
 7 
 8 def wrapper2(f):
 9     def inner2():
10         print('你好2')
11         f()
12         print('很好2')
13     return inner2
14 @wrapper1
15 @wrapper2
16 def fun():
17     print('都很好')
18 fun()
19 
20 输出--------------21 你好2
22 都很好
23 很好2
24 很好1

执行顺序:

 

 

 

---恢复内容结束---

posted @ 2018-10-03 22:25  明朗学习之路  阅读(139)  评论(0编辑  收藏  举报