返回介绍

元类模型

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

要真正理解元类是如何工作的,需要更多地理解Python的类型模型以及在class语句的末尾发生了什么。

类是类型的实例

到目前为止,在本书中,我们已经通过创建内置类型(如列表和字符串)的实例,以及我们自己编写的类的实例,完成了大多数工作。正如我们已经看到的,类的实例有一些自己的状态信息属性,但它们也从所创建自的类继承了行为属性。对于内置类型也是如此,例如,列表实例拥有自己的值,但是它们从列表类型继承方法。

尽管我们可以用这样的实例对象做很多事情,但Python的类型模型实际上比我前面所介绍的要丰富一些。实际上,该模型中有一个我们目前为止可以看到的漏洞:如果实例自类创建,那么,是什么创建了类?这证明了类也是某物的实例:

·在Python 3.0中,用户定义的类对象是名为type的对象的实例,type本身是一个类。

·在Python 2.6中,新式类继承自object,它是type的一个子类;传统类是type的一个实例,并且并不创建自一个类。

我们在本书第9章中介绍了类型的概念,在第31章介绍了类和类型的关系,但是,让我们在这里回顾一下基础知识,看看它们是如何应用于元类的。

还记得吧,type内置函数返回任何对象的类型(它本身是一个对象)。对于列表这样的内置类型,实例的类型是一个内置的列表类型,但是,列表类型的类型是类型type自身——顶层的type对象创建了具体的类型,具体的类型创建了实例。你将会在交互提示模式中亲自看到这点。例如,在Python 3.0中:

正如我们在第31章中学习新式类的时候所看到的,在Python 2.6中(及更早的版本中),通常也是一样的,但是,类型并不完全和类相同——type是一种独特的内置对象,它位于类型层级的顶层,并且用来构建类型:

这说明了类型/实例关系对于类来说也是成立的:实例创建自类,而类创建自type。在Python 3.0中,“类型”的概念与“类”的概念合并了。实际上,这两者基本上是同义词——类是类型,类型也是类。即:

·类型由派生自type的类定义。

·用户定义的类是类型类的实例。

·用户定义的类是产生它们自己的实例的类型。

正如我们在前面看到的,这一对等效果的代码测试实例的类型:一个实例的类型是产生它的类。这也暗示着,创建类的方式证明是本章主题的关键所在。由于类通常默认地创建自一个根类型类,因此大多数程序员不需要考虑这种类型/类对等性。然而,它开创了定制类及其实例的新的可能性。

例如,Python 3.0中的类(以及Python 2.6中的新式类)是type类的实例,并且实例对象是它们的类的实例。实际上,类现在有了连接到type的一个__class__,就像是一个实例有了链接到创建它的类的__class__:

特别注意这里的最后两行——类是type类的实例,就像常规的实例是一个类的实例一样。在Python 3.0中,这对于内置类和用于定义的类类型都是成立的。实际上,类根本不是一个独立的概念:它们就是用户定义的类型,并且type自身也是由一个类定义的。

在Python 2.6中,对于派生自object的新式类,情况也是如此,因此,这保证了Python 3.0的类行为:

然而,Python 2.6中的传统类略有不同——因为它们反映了老Python版本中的类模型,它们没有一个__class__链接,并且像Python 2.6中的内置类型一样,它们是type的实例,而不是一个类型实例:

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

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

发布评论

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