【Python】装饰器
形式
1 | def decorator(func): |
栗子:将f1函数不改变函数体条件下增加打印当前调用时间功能1
2
3
4
5
6
7
8
9
10
11import time
def decorator(func): # 传入原函数
def wrapper():
print(time.time()) # 增加的新功能
func() # 确保函数的原功能的进行
return wrapper # 返回内部函数(闭包)
# @语法糖
def f1():
print('This is a function')
f1()
1581497430.8031123
This is a function
如果不用装饰器
1 | import time |
无法看出新功能的添加,而是通过新函数调用原函数
将新函数打包进入装饰函数,通过装饰函数传入原函数,返回打包的新功能函数,形成闭包。进而可使用@语法糖
优化:支持不同个数参数
- 在内部打包函数中传入可变参数
- 在打包函数中老函数的调用中传入可变参数
1 | import time |
1581498420.7538562
This is a function test1
1581498420.7538562
This is another funcion test2 test3
优化:支持关键字参数
- 内部打包函数传入“**关键字参数”
- 调用老函数时,传入“**关键字参数”
1 | import time |
1581499561.933681
This is a function test1
1581499561.933681
This is another funcion test2test3
1581499561.933681
{'a': 1, 'b': 2, 'c': 3}
关键字参数:
- 关键字参数允许你传入0个或任意多个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
- 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数,以扩展函数的功能
- 至于到底传入了哪些关键字参数,就需要在函数内部通过kw检查
1 | def fun(**kw): |
{'a': 1, 'b': 2, 'c': 3}
思想
不去改动函数内部代码的实现,改变函数的行为
满足开闭原则
满足函数复用性
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SYolin's Blog!
评论