返回介绍

把任何装饰器应用于方法

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

前面的元类示例只对一个特定的函数装饰器有效,即跟踪。然而,将这个通用化以把任何装饰器应用到一个类的所有方法,实际的意义不大。我们所要做的是,添加一个外围作用域层,以保持想要的装饰器,这很像是我们在上一章对装饰器所做的。如下的示例,编写了这样的一个泛化,然后使用它再次应用跟踪装饰器:

当这段代码运行的时候,输出再次与前面的示例相同——最终我们仍然在一个客户类中用跟踪器函数装饰器装饰了每个方法,但是,我们以一种更为通用的方式做到了这点:

现在,要对方法应用一种不同的装饰器,我们只要在类标题行替换装饰器名称。例如,要使用前面介绍的计时器函数装饰器,定义类的时候,我们可以使用如下示例标题行的最后两行中的任何一个——第一个接收了定时器的默认参数,第二个指定了标签文本:

注意,这种方法不支持对每个方法不同的非默认装饰器参数,但是,它可以传递到装饰器参数中以应用到所有方法,就像这里所做的一样。为了进行测试,使用这些元类声明的最后一个来应用定时器,并且在脚本的末尾添加如下的行:

新的输出如下所示——现在,元类把方法包装到了定时器装饰器中,以便我们可以说出针对类的每个方法的每次调用花费多长时间:

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

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

发布评论

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