import functools defstart_end_decorator_4(func): @functools.wraps(func) defwrapper(*args, **kwargs): print('Start') result = func(*args, **kwargs) print('End') return result return wrapper
@start_end_decorator_4 defadd_5(x): return x + 5 result = add_5(10) print(result) print(add_5.__name__) help(add_5)
Start End 15 add_5 Help on function add_5 in module __main__:
add_5(x)
装饰器的最终模板
现在,我们已经有了所有部分,用于任何装饰器的模板如下所示:
import functools
defmy_decorator(func): @functools.wraps(func) defwrapper(*args, **kwargs): # Do something before result = func(*args, **kwargs) # Do something after return result return wrapper
defrepeat(num_times): defdecorator_repeat(func): @functools.wraps(func) defwrapper(*args, **kwargs): for _ in range(num_times): result = func(*args, **kwargs) return result return wrapper return decorator_repeat
# 装饰器函数,它输出有关包装函数的调试信息 defdebug(func): @functools.wraps(func) defwrapper(*args, **kwargs): args_repr = [repr(a) for a in args] kwargs_repr = [f"{k}={v!r}"for k, v in kwargs.items()] signature = ", ".join(args_repr + kwargs_repr) print(f"Calling {func.__name__}({signature})") result = func(*args, **kwargs) print(f"{func.__name__!r} returned {result!r}") return result return wrapper