标签:改变 wrap 接收 color span turn pre 闭包 结构
1.概念:在不改变原函数结构的情况下,给函数体本身增加部分功能(常见如接口函数被调用时,自动打印接口被调用日志)
2.本质:装饰器的本质是一个闭包函数,而闭包函数的本质是变量作用域的外溢(外层函数中包裹的内部函数可使用外层函数的参数,以及接受其值)
3.分类:
a.函数装饰器
def deco(func): #func即是要接收的被砖石的函数名 def wrapper(*args,**kwargs): #可以根据被装饰的函数需不需要传参,给被装饰的对象传入参数 res=func(*args,**kwargs) #本质就是调用被装饰的函数, 接收传进来的参数 print("xyz") return res #接收被装饰函数的返回值,没有则返回None return wrapper @deco def sun(a): print(str(a)) print("abc") if __name__ == "__main__": sun(123) 输出结果: 123 abc xyz
b.装饰器类(实现了__init__和__call__方法的类)
import time class Foo(): def __init__(self,func): self.func = func def __call__(self): print("装饰函数开始运行...") start_time = time.time() print(start_time) self.func() end_time = time.time() print("装饰完成...") print(end_time) @Foo def sun(): print("执行sun函数...") if __name__ == "__main__": sun() 输出: 装饰函数开始运行... 1592806290.9291573 执行sun函数... 装饰完成... 1592806290.9291573
c.装饰器类接受被装饰函数的多个参数
class Cho: def __init__(self,name): self.name = name def __call__(self,func): def wrapper(*args,**kwargs): print(‘----‘,self.name) return func(*args,**kwargs) return wrapper
标签:改变 wrap 接收 color span turn pre 闭包 结构
原文地址:https://www.cnblogs.com/suntao-jupyter/p/13176594.html