装饰器执行顺序

装饰器执行顺序,第1张

装饰器执行顺序

装饰器 包装 正在装饰的功能。这样就

make_bold
修饰了
make_italic
装饰器的结果,从而修饰了
hello
功能。

@decorator
语法真的只是语法糖; 以下:

@decoratordef decorated_function():    # ...

实际执行为:

def decorated_function():    # ...decorated_function = decorator(decorated_function)

返回的内容替换原始

decorated_function
对象
decorator()

堆叠装饰器会 向外 重复该过程。

因此,您的示例:

@make_bold@make_italicdef hello():  return "hello world"

可以扩展为:

def hello():  return "hello world"hello = make_bold(make_italic(hello))

当你打电话

hello()
了,你调用返回的对象
make_bold()
,真的。
make_bold()
返回一个
lambda
,调用
make_bold
包装的函数,这是的返回值
make_italic()
,它也是一个调用原始函数的lambda
hello()
。扩展所有这些调用,您将得到:

hello() = lambda : "<b>" + fn() + "</b>" #  where fn() ->    lambda : "<i>" + fn() + "</i>" # where fn() ->         return "hello world"

因此输出变为:

"<b>" + ("<i>" + ("hello world") + "</i>") + "</b>"


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5507818.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存