返回介绍

装饰器嵌套

发布于 2024-01-29 22:24:14 字数 1457 浏览 0 评论 0 收藏 0

有的时候,一个装饰器不够。为了支持多步骤的扩展,装饰器语法允许我们向一个装饰的函数或方法添加包装器逻辑的多个层。当使用这一功能的时候,每个装饰器必须出现在自己的一行中。这种形式的装饰器语法:

如下这样运行:

这里,最初的函数通过3个不同的装饰器传递,并且最终的可调用对象返回来分配给最初的名称。每个装饰器处理前一个的结果,这可能是最初的函数或一个插入的包装器。如果所有的装饰器都插入包装器,直接的效果就是,当调用最初的函数名时,将会调用包装对象逻辑的3个不同的层,从而以3种不同的方式扩展最初的函数。列出的最后的装饰器是第一次应用的并且最深层次的嵌套。

就像对函数一样,多个类装饰器导致了多个嵌套的函数调用,并且可能导致围绕实例创建调用的包装器逻辑的多个层。例如,如下的代码:

等同于如下的代码:

再次,每个装饰器都自由地返回最初的类或者一个插入的包装器对象。有了包装器,当最终请求最初C类的一个实例的时候,这一调用会重定向到spam和eggs装饰器提供的包装层对象,二者可能有任意的不同角色。

例如,如下的什么也不做的装饰器只是返回被装饰的函数:

同样的语法在类上也有效,就像这里什么也不做的装饰器一样。

然而,当装饰器插入包装器函数对象,调用的时候它们可能扩展最初的函数——如下的代码将其结果连接到一个装饰器层中,随着它从内向外地运行层:

我们在这里使用了lambda函数来实现包装器层(每个层在一个封闭的作用域里保持了包装的函数)。实际上,包装器可以采取函数、可调用的类以及更多形式。当设计良好的时候,装饰器嵌套允许我们以种类多样的方式来组合扩展步骤。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文