decorator 装饰器

decorator 装饰器

普通装饰器

有个计算a+b的函数

def add(a, b):
    return a+b

现在想要在函数执行前后进行操作,可以用装饰器

from functools import wraps

def log(func):
    @wraps(func) # 避免原函数的__name__等属性发生变化
    def wrapper(*args, **kwargs)
        print('before func')
        func(*args, **kwargs) # 执行原函数,若不调用则不执行原函数
        print('after func')
    return wrapper
    
@log # @:装饰器语法糖
def add(a, b):
    return a+b
    
'''
add(1, 2)
output: 
before func
3
after func
'''

带参数的装饰器

要实现带参数的装饰器,只需要再用一个函数包装普通装饰器就行

from functools import wraps

def log(text):
    def decorator(func):
        @wraps(func) # 避免原函数的__name__等属性发生变化
        def wrapper(*args, **kwargs)
            print(text)
            func(*args, **kwargs) # 执行原函数,若不调用则不执行原函数
            print('after func')
        return wrapper
    return decorator
    
@log('log') # @:装饰器语法糖
def add(a, b):
    return a+b
    
'''
add(1, 2)
output: 
log
3
after func
'''