python之装饰器

装饰器是一类特殊的函数,其可以在不改变原函数的功能的前提下,去拓展函数的功能,相当于装饰了一层新功能。装饰器有两大类函数装饰器和类装饰器,
两类装饰器可以相互装饰,实现需要的功能。
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()

  

原文地址:https://www.cnblogs.com/xuehaiwuya0000/p/10850495.html