1. 原生装饰器(不带括号)
● 写法: @decorator
● Python 翻译: func = decorator(func)
● 执行逻辑:
● 一步到位。直接把下面的函数 func 扔进 decorator 里。
● 要求: decorator 必须直接接收一个函数作为参数。
2. 带参装饰器(带括号)
● 写法: @decorator(args)
● Python 翻译: func = decorator(args)(func)
● 执行逻辑:
● 分两步走(这也是你理解的精髓)。
● 第一步(计算结果): 先执行 decorator(args) 。这一步得到的结果(返回值)
● 第二步(真正装饰): 拿着第一步返回的那个“新装饰器”,去接收下面的函数 func 。
回答
问题补充:
传1.3
当你写 @inner(1, 3) 时,Python 的执行逻辑发生了巨大的变化。它会先计算 @ 后面的表达式,也就是先运行 inner(1, 3) 。
● 它期望 inner 能处理这两个数字。
● 现实: 你的 inner 定义是 def inner(f): ,它只想要一个函数,不想要数字。
● 结果: 💥 Boom! 报错! (程序在这里就挂了,根本没机会进行第二步)。
传1
def inner(f): # 这里的 f 其实是数字 1
def wrapper(*args, **kwargs):
print(“增强逻辑”)
f() # 这里试图调用 1() -> 整数不可调用!
return wrapper
版权:言论仅代表个人观点,不代表官方立场。转载请注明出处:https://www.stntk.com/question/2738.html

还没有评论呢,快来抢沙发~