装饰器
Posted 不会起名字
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。
装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数的功能镜像扩展
语法糖:
1 import time 2 def timer(func): 3 def inner(): 4 start = time.time() 5 func() 6 print(time.time() - start) 7 return inner 8 @timer #==> func1 = timer(func1) ===>语法糖 9 def func1(): 10 print(‘in func1‘) 11 func1() 12 13 装饰器——语法糖
开放封闭原则:对扩展开放,对修改封闭
1.对扩展是开放的
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
为什么要对修改封闭呢?
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则。
装饰器的主要功能和固定格式:
功能:在不改变函数的调用方式的基础上在函数前后添加某些功能
固定格式:
1 def timer(func): 2 def inner(*args,**kwargs): 3 ‘‘‘执行函数之前要做的‘‘‘ 4 re = func(*args,**kwargs) 5 ‘‘‘执行函数之后要做的‘‘‘ 6 return re 7 return inner
带参数的装饰器:
1 def outer(flag): 2 def timer(func): 3 def inner(*args,**kwargs): 4 if flag: 5 print(‘‘‘执行函数之前要做的‘‘‘) 6 re = func(*args,**kwargs) 7 if flag: 8 print(‘‘‘执行函数之后要做的‘‘‘) 9 return re 10 return inner 11 return timer 12 @outer(False) 13 def func(): 14 print(111) 15 func()
多个装饰器修饰同一个函数:
1 def wrapper1(func): 2 def inner(): 3 print(‘wrapper1 ,before func‘) 4 func() 5 print(‘wrapper1 ,after func‘) 6 return inner 7 def wrapper2(func): 8 def inner(): 9 print(‘wrapper2 ,before func‘) 10 func() 11 print(‘wrapper2 ,after func‘) 12 return inner 13 @wrapper2 14 @wrapper1 15 def f(): 16 print(‘in f‘) 17 f()
以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章