装饰器 包装 正在装饰的功能。这样就
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>"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)