什么是装饰器
装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能
为何要用装饰器
开放封闭原则
开放:指的是对拓展功能是开放的
封闭:指的是对修改源代码是封闭的
装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能
如何用
例
import time
def outter(func):
def wrapper(*args, **kwargs): #这样可以传任何值
start = time.time() # start 和 stop 是增加的新功能
res=func(*args, **kwargs) # res 和return res 是被装饰的
stop = time.time()
print(stop - start)
return res
return wrapper
@outter
def home(name):
time.sleep(2)
print('welcome %s to home page' % name)
home('123')
例
import time from functools import wraps def outter(func): @wraps(func) # 将原函数的属性赋值给wrapper函数 def wrapper(*args, **kwargs): #这样可以传任何值 start = time.time() # start 和 stop 是增加的新功能 res=func(*args, **kwargs) # res 和return res 是被装饰的 stop = time.time() print(stop - start) return res return wrapper @outter def index(x,y): """zhe shi zhu ye""" print(x,y) print(index.__doc__) # 查看index的一些属性 print(index.__name__) # 查看index的一些属性
有参装饰器
import time def defouted(den): def outter(func): def wrapper(*args, **kwargs): if den=='abc': start = time.time() res=func(*args, **kwargs) stop = time.time() print(stop - start) return res else: print('错了') return wrapper @defouted(den="abc") def index(x,y): """zhe shi zhu ye""" print(x,y)
叠加多个装饰器的加载,分析
def deco1(func1): def wrapper1(*args,**kwargs): print('装饰器1进行') res1=func1(*args,**kwargs) return res1 return wrapper1 def deco2(func2): def wrapper2(*args,**kwargs): print('装饰器2进行') res2=func2(*args,**kwargs) return res2 return wrapper2 @deco1 @deco2 def index(x): print('我是主角%s'% x) index(6666666666) # 加载顺序自下而上(了解) # @deco1 index=deco1(wrapper2的内存地址) ==>index=wrapper1的内存地址 # @deco2 index=deco2(index)==> index==wrapper的内存地址 # 执行顺序自上而下
yield
例
# s=yield 返回值 # def dog(name): # print('123%s'% name) # while True: # x=yield # print('456%s'% x) # # s=dog('豆豆') # # s.send(None) # 相当于初始化一下,没有不行,也可以 next(s) # s.send('东东1') # s.send('东东2') # # s.close() # 关闭后后面的就进行不了了 # s.send('123')
例
# def dog(name): # print('123%s'% name) # while True: # x=yield 888 # print('456%s'% x) # # s=dog('豆豆') # # s.send(None) # 相当于初始化一下,没有不行,也可以 next(s) # res=s.send('东东1') # print(res) # res=s.send('东东2') # print(res) # res=s.send('东东3') # print(res) # s.send('东东2') # s.close() # 关闭后后面的就进行不了了 # s.send('123')