首页 问答 装饰器如果带了参数…
问题详情

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

发表评论
暂无评论

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

点击联系客服

在线时间:8:00-16:00

客服QQ

70068002

客服电话

400-888-8888

客服邮箱

70068002@qq.com

扫描二维码

关注微信公众号

扫描二维码

手机访问本站