Python函数式编程之装饰器
2018-10-11 09:58:44来源:博客园 阅读 ()
原则:对修改是封闭的,对扩展是开放的,
方法:一般不修改函数或者类,而是扩展函数或者类
一:装饰器
允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起,
使用装饰对象的任何对象与装饰前后该对象的交互遵循完全相同的方式
二:装饰器的用途
(1)增强一个组件向另一个组件发送数据时的响应能力
(2)支持多种可选行为
(3)对一个单元做代码上的修改(即代码的复用)
1 import time 2 3 # ----------------------------------------------------------------# 4 # 装饰器一 5 # ----------------------------------------------------------------# 6 7 8 def f1(): 9 print("Local time is ") 10 # print(time.time()) 11 12 13 def f2(): 14 print("Local time is ") 15 # print(time.time()) 16 17 18 f1() 19 f2() 20 21 # 给每一个函数添加一个打印当前时间,做下面的修改,没有违反修改是封闭的原则 22 23 24 def print_current_time(func): 25 print(time.time()) 26 func() 27 28 29 print_current_time(f1) 30 print_current_time(f2) 31 32 # 抛出问题 打印时间是函数本身的,并不是强加函数 33 34 # ----------------------------------------------------------------# 35 # 装饰器二 36 # ----------------------------------------------------------------# 37 38 39 def decorator(func): 40 def wrapper(): # 被封装的意思 41 print(time.time()) 42 func() 43 return wrapper 44 45 46 def f1(): 47 print("This is a function:") 48 49 50 f = decorator(f1) # 将函数f1装饰 51 f() # 执行装饰后的结果 52 53 54 # ----------------------------------------------------------------# 55 # 装饰器三 56 # ----------------------------------------------------------------# 57 58 59 def decorator(func): 60 def wrapper(): # 被封装的意思 61 print(time.time()) 62 func() 63 return wrapper 64 65 66 @decorator 67 def f1(): 68 print("This is a function:") 69 70 71 f1() # 不改变函数的调用 72 73 74 # ----------------------------------------------------------------# 75 # 装饰器四 76 # ----------------------------------------------------------------# 77 78 def hello(fn): # fn为回调函数 79 def wrapper(): 80 print('hello, %s' % fn.__name__) 81 fn() 82 print('goodbye, %s' % fn.__name__) 83 return wrapper 84 85 86 @hello 87 def foo(): 88 print("I am a foo") 89 90 91 foo() 92 93 94 # ----------------------------------------------------------------# 95 # 装饰器五之装饰器终极形态 96 # ----------------------------------------------------------------# 97 98 99 def decorator(func): 100 def wrapper(*func_name, **kw): # 被封装的意思 101 print(time.time()) 102 func(*func_name, **kw) # 处理抽象函数 103 return wrapper 104 105 106 @decorator 107 def f_1(func_name): 108 print("This is a function:" + func_name) 109 110 111 @decorator 112 def f_2(func_name1, func_name2): # 多参数函数 113 print("This is a function:" + func_name1 + func_name2) 114 115 116 @decorator 117 def f_3(func_name1, func_name2, **kw): 118 print("This is a function:" + func_name1 + func_name2) 119 print(kw) 120 121 122 def f_4(func_name1, func_name2, **kw): 123 print("This is a function:" + func_name1 + func_name2) 124 print(kw) 125 126 127 f_1('qqq') # 不改变函数的调用 128 f_2('aa', 'dd') 129 f_4('aa', 'dd', a=1, b=2, c=3) 130 f_3('aa', 'dd', a=1, b=2, c=3)
一步一步理解装饰器,装饰器特别好用!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash