python-fullstack-s13-day12-python基础

1、通用装饰器回顾

开闭原则:对增加功能开放,修改代码封闭
装饰器的作用:在不改变原有代码的基础上给一个函数增加功能
通用装饰器的写法:

 1 def wrapper(fn):
 2     def inner(*args, **kwargs):
 3         """before the func"""
 4         ret = fn(*args, **kwargs)
 5         """after the func"""
 6         return ret
 7     return inner
 8 @wrapper
 9 def func():
10     print("this is func")
11 func()    

2、函数的有用信息

 1 def eat(food,drink):
 2     """
 3     这里是函数的注释,先写一下当前这个函数是干什么的,比如
 4     我这个函数就是一个吃
 5     :param food:参数food是什么意思
 6     :param drink:参数drink是什么意思
 7     :return:返回的是什么东东
 8     """
 9     print(food,drink)
10     """
11     这个可以获取到么?
12     """
13     print(eat.__doc__)
14     print(eat.__name__)
15     return "very good"
16 eat("吃嘛嘛香","我不想吃")
17 print(eat.__doc__)
18 print(eat.__name__)
19 # 函数名.__name__可以查看函数的名字
20 # 函数名.__doc__可以查看函数的文档注释

  当函数被装饰器装饰之后,其函数名在查看的时候会改变成inner,为了解决这个问题需要引入from functools import wraps,在inner函数上方@wraps,这样当查看外部的原函数的名字时会按原本的来。

3、带参数的装饰器

 1 from functools import wraps
 2 def wrapper_out(flag):
 3     def wrapper(fn):
 4         @wraps(fn)
 5         def inner(*args,**kwargs):
 6             if flag == True:
 7                 print("约之前问问金老板,是不是安全啊!")
 8                 ret = fn(*args,**kwargs)
 9                 print("我擦,金老板骗我!")
10                 return ret
11             else:
12                 ret = fn(*args, **kwargs)
13                 return ret
14         return inner
15     return wrapper
16 @wrapper_out(True)
17 def yue():
18     print("约起来吧")
19 yue()
20 print(yue.__name__)

4、多个装饰器同事装饰一个函数

 1 def wrapper1(fn):
 2     def inner(*args, **kwargs):
 3         print("alex要上香了!")
 4         ret = fn(*args, **kwargs)
 5         print("武sir要上香了!")
 6         return ret
 7     return inner
 8 def wrapper2(fn):
 9     def inner(*args, **kwargs):
10         print("来来来,老男孩开始给财神香了!")
11         ret = fn(*args, **kwargs)
12         print("好好好,财神我会保护你们的!")
13         return ret
14     return inner
15 def wrapper3(fn):
16     def inner(*args, **kwargs):
17         print("来来来,看看老男还这帮财迷!")
18         ret = fn(*args, **kwargs)
19         print("我擦,你们给财神我上假香,画圈圈诅咒你们!")
20         return ret
21     return inner
22 
23 @wrapper3
24 @wrapper2
25 @wrapper1
26 def money():
27     print("今年要发大财了啊!")
28 money()
29 # 多个装饰器同时装饰一个函数会依照顺序执行,类似于 {[(目标函数)]}从前往后执行

猜你喜欢

转载自www.cnblogs.com/bug-ming/p/9187077.html