返回介绍

Class 语句协议

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

子类化type类以定制它,这其实只是元类背后的魔力的一半。我们仍然需要把一个类的创建指向元类,而不是默认type。为了完全理解这是如何安排的,我们还需要知道class语句如何完成其工作。

我们已经学习过,当Python遇到一条class语句,它会运行其嵌套的代码块以创建其属性——所有在嵌套代码块的顶层分配的名称都产生结果的类对象中的属性。这些名称通常是嵌套的def所创建的方法函数,但是,它们也可以是分配来创建由所有实例共享的类数据的任意属性。

从技术上讲,Python遵从一个标准的协议来使这发生:在一条class语句的末尾,并且在运行了一个命名控件词典中的所有嵌套代码之后,它调用type对象来创建class对象:

type对象反过来定义了一个__call__运算符重载方法,当调用type对象的时候,该方法运行两个其他的方法:

__new__方法创建并返回了新的class对象,并且随后__init__方法初始化了新创建的对象。正如我们稍后将看到的,这是type的元类子类通常用来定制类的钩子。

例如,给定一个如下所示的类定义:

Python将会从内部运行嵌套的代码块来创建该类的两个属性(data和meth),然后在class语句的末尾调用type对象,产生class对象:

由于这个调用在class语句的末尾进行,它是用来扩展或处理一个类的、理想的钩子。技巧在于,用将要拦截这个调用的一个定制子类来替代类型,下一节将展示如何做到这一点。

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

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

发布评论

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