首页 > 代码库 > Python D9 and D10
Python D9 and D10
装饰器
一、本质
装饰器的本质就是一个闭包函数,因此具有闭包函数的一切功能。可以在不改变原代码的情况下,在这个函数上扩展功能。
二、装饰器的形成
装饰器就是为了扩展其他函数功能而添加的函数。
举个最简单的例子:
import time def func1(): print(‘in func1‘) def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner func1 = timer(func1) func1()
然而大家可以看出,在使用装饰器时的赋值非常麻烦,每用一次就要进行一次赋值。为了解决这个问题就引入了一个新的概念:语法糖。
import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer #==> func1 = timer(func1) def func1(): print(‘in func1‘) func1()
大家可以看出,只要在定义一个函数的时候在上面紧贴的位置加一个@解释器的结构就可以在调用函数的时候直接加上了,是不是非常方便?接下来引入三个概念
1.装饰器——带参数的装饰器
def timer(func): def inner(a): start = time.time() func(a) print(time.time() - start) return inner @timer def func1(a): print(a) func1(1)
2.装饰器—万能装饰器
import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func1 = timer(func1) def func1(a,b): print(‘in func1‘) @timer #==> func2 = timer(func2) def func2(a): print(‘in func2 and get a:%s‘%(a)) return ‘fun2 over‘ func1(‘aaaaaa‘,‘bbbbbb‘) print(func2(‘aaaaaa‘))
3.装饰器—带返回值的装饰器
import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func2 = timer(func2) def func2(a): print(‘in func2 and get a:%s‘%(a)) return ‘fun2 over‘ func2(‘aaaaaa‘,‘bbbbbb‘) print(func2(‘aaaaaa‘))
三、开放封闭原则
1.对扩展是开放的
任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
四、装饰器的固定格式
def timer(func): def inner(*args,**kwargs): ‘‘‘执行函数之前要做的‘‘‘ re = func(*args,**kwargs) ‘‘‘执行函数之后要做的‘‘‘ return re return inner
五、多个装饰器装饰一个函数
def pipixia(func): def inner(): print(‘wrapper1 ,before func‘) func() print(‘wrapper1 ,after func‘) return inner def qqxing(func): def inner(): print(‘wrapper2 ,before func‘) func() print(‘wrapper2 ,after func‘) return inner @qqxing @pipixia def f(): print(‘in f‘) f()
这个过程就像是一层套一层一样,一层层的执行
Python D9 and D10
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。