装饰器进阶

Posted python884

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器进阶相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

执行顺序:

 技术分享图片

 

 

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

以上是关于装饰器进阶的主要内容,如果未能解决你的问题,请参考以下文章

12.前方高能-装饰器进阶

python使用上下文对代码片段进行计时,非装饰器

基础学习之第十二天(装饰器的进阶)

函数进阶(装饰器)

Python进阶第九篇装饰器

测开之函数进阶篇・第七篇《装饰器》