- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
元类模型
类是类型的实例
到目前为止,在本书中,我们已经通过创建内置类型(如列表和字符串)的实例,以及我们自己编写的类的实例,完成了大多数工作。正如我们已经看到的,类的实例有一些自己的状态信息属性,但它们也从所创建自的类继承了行为属性。对于内置类型也是如此,例如,列表实例拥有自己的值,但是它们从列表类型继承方法。
尽管我们可以用这样的实例对象做很多事情,但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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论