Python装饰器

90 阅读1分钟

1.不带参数的装饰器

下面是一个不带参数的装饰器标准写法,可以看出,装饰器就是一个参数是函数的函数

form functools import wraps

def decorator(func):  
    # wraps 相当于 让 wrap.__name__=func.__name__,
    # wrap.__doc__==func.__doc__
    @wraps(func) 
    def wrap(*arg,**kwargs):
        # todo somting
        return func(*arg,**kwargs)
    return wrap 

@decorator
def add(x,y):
    return x+y

效果相当于下面

add = decorator(add)  # 实际 add 变成了decorator里面的 wraps
add() 相当于运行 wrap()

2.带参数的装饰器

# 定义decorator用来接收自己需要的参数
def decorator(*dec_args,**dec_kwargs):
    # 从 wrap 开始相当于不带参数的装饰器,
    def wrap(func):
        @wraps(func) 
        def inner(*args,**kwargs):
           func(*args,**kwargs) 
        return inner
    return wrap