第 40 章 元类 元类
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在上一章中,我们探讨了装饰器,并研究了使用装饰器的各种示例。在本书的最后一个技术章节中,我们将继续关注工具构建器,并研究另一个高级主题:元类。
从某种意义上说,元类只是扩展了装饰器的代码插入模型。正如我们在前一章中学到的,函数和类装饰器允许我们拦截和增强函数调用和类实例创建调用。与此类似,元类也允许我们拦截和增强类的创建--元类提供了一个 API,用于在class 语句结束时插入额外的逻辑,尽管其方式与装饰器不同。因此,元类为管理程序中的类对象提供了一种通用协议。
与本书这一部分涉及的所有主题一样,这是一个高级主题,可以根据需要进行研究。实际上,元类允许我们对一组类的工作方式进行高度控制。这是一个强大的概念,但元类并不适合大多数应用程序编程人员。坦率地说,这也不是一个适合胆小者的主题--本章的某些部分可能需要额外关注(其他部分甚至可能要归功于苏斯博士!)。
另一方面,元类打开了通向各种编码模式的大门,而这些模式在其他情况下可能很难实现,或者根本无法实现,对于那些希望编写灵活的API或编程工具供他人使用的程序员来说,元类尤其重要。即使您不属于这一类,元类也能让您了解 Python 的类模型 (正如我们将看到的,它们甚至会影响继承),并且是理解使用元类的代码的先决条件。与其他高级工具一样,元类开始频繁地出现在 Python 程序中,这可能超出了其创造者的预期。
与前一章一样,我们在本章中的部分目标也是展示比本书前几章更真实的代码示例。虽然元类是语言的核心主题,本身并不属于应用领域,但本章的部分目的是激发你在学完本书后探索更大的应用编程示例的兴趣。
因为这是本书的最后一个技术章节,它也开始总结一些与 Python 本身有关的线索,这些线索是我们在学习 Python 的过程中经常遇到的,并将在后面的结论中最终确定。当然,本书之后的 Go 是由你自己决定的,但在一个开源项目中,重要的是在黑客攻击小细节的同时保持大局观。
要不要元分类
元类是也许是本书中最先进的主题,如果不是整个 Python 语言的话。借用资深Python核心开发者 Tim Peters(他也是著名的 "import this "Python 格言的作者)在comp.lang.python新闻组中的一段话:
[元类]是更深层次的魔法,99% 的用户都不需要担心。如果你想知道自己是否需要它们,那你就不需要了(真正需要它们的人肯定知道自己需要它们,不需要解释原因)。
换句话说,元类主要适用于为他人构建应用程序接口和工具的程序员。在很多情况下(如果不是大多数情况的话),元类可能并不是应用程序工作中的最佳选择。 如果你开发的代码将来会被其他人使用,那就更是如此了。除非你是在实验或学习,否则 "因为看起来很酷 "而编写代码通常不是一个合理的理由。
尽管如此,元类仍有许多潜在的作用,了解它们何时有用非常重要。例如,元类可以用来增强类的功能,如跟踪、对象持久化、异常日志等。它们还可用于在运行时根据配置文件构建类的一部分,对类的每个方法泛型应用函数装饰器,验证与预期接口的一致性,等等。
元类甚至可以用来实现其他编码模式,如面向方面的编程、数据库的对象/关系映射器(ORM)等等。 虽然实现这些结果通常有其他方法--正如我们将看到的,类装饰器和元类的作用通常是交叉的--但元类提供了一个为这些任务量身定制的正式模型。当然,我们没有篇幅在本章中探讨所有此类应用的第一手资料,但在学习了本章的基础知识后,您可以随时在网上搜索其他用例。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access