装饰器是一类特殊的函数,其可以在不改变原函数的功能的前提下,去拓展函数的功能,相当于装饰了一层新功能。装饰器有两大类函数装饰器和类装饰器,
两类装饰器可以相互装饰,实现需要的功能。
1.分类: 1.1 普通装饰器 def func(f): def wrap(*args,**kwargs): print("is using:",f.__name__) return f(*args,**kwargs) return wrap @func def max(): print("hello") max() 1.2 带参数的装饰器 定义带参数的装饰器时,其格式是在普通装饰器的基础上,再包裹一层。 def decorator(a): def wrapper(func): def wrapper1(*args,**kwargs): return func(*args,**kwargs) return wrapper1 return wrapper @decorator(a=10) def max(a,b): print(a,b,a+b) max(3,5)
1.3 类装饰器
类装饰器主要利用了魔术方法__call__的功能。在调用类时,自动执行__call__方法。 class Decorator(): def __init__(self, func): self.__func = func def __call__(self, *args, **kwargs): return self.__func() @Decorator def func(): print("i am a usual function") func()
2.多个装饰器同时装饰一个函数
def decorator1(func): print("this is a decorator1") def wrapper(*args, **kwargs): print("1 is using wrapper") return func(*args, **kwargs) return wrapper def decorator2(func): print("this is a decorator2") def wrapper(*args, **kwargs): print("2 is using wrapper") return func(*args, **kwargs) return wrapper @decorator1 @decorator2 def func(): print("i am a usual function") func()
******************
调试结果如下:
this is a decorator2
this is a decorator1
1 is using wrapper
2 is using wrapper
i am a usual function
其执行原则:@符号接近函数的先被装饰。
3.装饰器路由功能:
路由功能是装饰器的一大特色,通过利用@将被装饰的函数装入字典,以实现不同功能的统一调用。
a={}
def decorator(var):
def wrapper1(func):
a[var] = func #line2,将add的引用提前装入字典,
def wrapper(*args, **kwargs):
print(id(wrapper))
return func(*args, **kwargs)
return wrapper
return wrapper1
@decorator("name")#执行到这一步时,相当于add=wrapper
def add():
print(id(add),"add hanshu")#因@的作用,此处add的id是wrapper的id
pass
add()