Decorator 写法#1:
import functools
def logging(f=None, param=None):
if f is None:
return functools.partial(logging, param=param)
@functools.wraps(f)
def wrapper(*args, **kwargs):
print(f"Running func {f.__name__} with param {param}")
return f(*args, **kwargs)
return wrapper
Decorator 写法#2:
def logging(f=None, param=None):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Running func {func.__name__} with param {param}")
return func(*args, **kwargs)
return wrapper
if f:
return decorator(func=f)
return decorator
Testing:
@logging
def my_func():
print("haha")
my_func()
@logging(param=1)
def my_func2():
print("haha2")
my_func2()
结果:
顺便讲下@functools.wraps,可以通过print被decorate的func name看出它起到的作用,比如print my_func.__name__。