绝对不要使用两个前导下划线,这是很烦人的自私行为。1
——Ian Bicking
pip、virtualenv 和 Paste 等项目的创建者
1摘自 Paste 的风格指南(http://pythonpaste.org/StyleGuide.html)。
得益于 Python 数据模型,自定义类型的行为可以像内置类型那样自然。实现如此自然的行为,靠的不是继承,而是鸭子类型(duck typing):我们只需按照预定行为实现对象所需的方法即可。
前一章分析了很多内置对象的结构和行为,这一章则自己定义类,而且让类的行为跟真正的 Python 对象一样。
这一章接续第 1 章,说明如何实现在很多 Python 类型中常见的特殊方法。
本章包含以下话题:
支持用于生成对象其他表示形式的内置函数(如 repr()、bytes(),等等)
使用一个类方法实现备选构造方法
扩展内置的 format() 函数和 str.format() 方法使用的格式微语言
实现只读属性
把对象变为可散列的,以便在集合中及作为 dict 的键使用
利用 __slots__ 节省内存
我们将开发一个简单的二维欧几里得向量类型,在这个过程中涵盖上述全部话题。
在实现这个类型的中间阶段,我们会讨论两个概念:
如何以及何时使用 @classmethod 和 @staticmethod 装饰器
Python 的私有属性和受保护属性的用法、约定和局限
我们从对象表示形式函数开始。