返回介绍

直接管理函数和类

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

本章中,我们的大多数示例都设计来拦截函数和实例创建调用。尽管这对于装饰器来说很典型,它们并不限于这一角色。因为装饰器通过装饰器代码来运行新的函数和类,从而有效地工作,它们也可以用来管理函数和类对象自身,而不只是管理对它们随后的调用。

例如,假设你需要被另一个应用程序使用的方法或类注册到一个API,以便随后处理(可能该API随后将会调用该对象,以响应事件)。尽管你可能提供一个注册函数,在对象定义之后手动地调用该函数,但装饰器使得你的意图更为明显。

这一思路如下的简单实现定义了一个装饰器,它既应用于函数也应用于类,把对象添加到一个基于字典的注册中。由于它返回对象本身而不是一个包装器,所以它没有拦截随后的调用:

当这段代码运行的时候,装饰的对象按照名称添加到注册中,但当随后调用它们的时候,它们仍然按照最初的编码工作,而没有指向一个包装器层。实际上,我们的对象可以手动运行,或从注册表内部运行:

例如,一个用户界面可能使用这样的技术,为用户动作注册回调处理程序。处理程序可能通过函数或类名来注册,就像这里所做的一样,或者可以使用装饰器参数来指定主体事件;包含装饰器的一条额外的def语句可能会用来保持这样的参数以便在装饰时使用。

这个例子是仿造的,但是,其技术很通用。例如,函数装饰器也可能用来处理函数属性,并且类装饰器可能动态地插入新的类属性,或者甚至新的方法。考虑如下的函数装饰器——它们把函数属性分配给记录信息,以便随后供一个API使用,但是,它们没有插入一个包含器层来拦截随后的调用:

这样的装饰器直接扩展了函数和类,没有捕捉对它们的随后调用。我们将在下一章见到更多的管理类的类装饰的例子,因为这证明了它已经转向了元类的领域;在本章剩余的部分,我们来看看使用装饰器的两个较大的案例。

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

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

发布评论

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