装饰器(decorator):在不改变原函数代码的情况下,给它添加额外的功能。# 定义装饰器de my_decorator(fun): def wrapper(): print("执行前") fun() print("执行后") return wrapper# wrapper:可以自定义其他的名字# 使用装饰器@my_decoratordef say_hello(): print("hello")# 执行say_hello()
@my_decorator等价于say_hello = my_decorator(say_hello)
def decorator(func): 接收函数 def wrapper(*args, **kwargs) 包装函数 return func(*args, **kwargs) return wrapper 返回函数
# 定义装饰器def repeat(n): def decorator(func): def wrapper(*args, **kwargs): for _ in range(n): func(*args, **kwargs) return wrapper return decorator#使用装饰器@repeat(3)def say(): print("hi)# 执行say()
python是先执行装饰器表达式,再把函数自动塞进去@后面的表达式会先执行,最终返回一个装饰器函数,然后python才把函数放进去。因此装饰器可以n-1层的参数传递,最后第n层是函数装饰器。总结:装饰器在函数定义的时候就执行一次,say()只是调用包装后的函数装饰器做的就是,在函数出生的时候,就给他换一个新的身份。