3.3. 特殊方法名称
一个类可以通过定义具有特殊名称的方法来实现由特殊语法所引发的特定操作 (例如算术运算或下标与切片)。这是 Python 实现 操作符重载 的方式,允许每个类自行定义基于操作符的特定行为。例如,如果一个类定义了名为 getitem()
的方法,并且 x
为该类的一个实例,则 x[i]
基本就等同于 type(x).getitem(x, i)
。除非有说明例外情况,在没有定义适当方法的情况下尝试执行一种操作将引发一个异常 (通常为 AttributeError
或 TypeError
)。
将一个特殊方法设为 None
表示对应的操作不可用。例如,如果一个类将 iter()
设为 None
,则该类就是不可迭代的,因此对其实例调用 iter()
将引发一个 TypeError
(而不会回退至 getitem()
). 2
在实现模拟任何内置类型的类时,很重要的一点是模拟的实现程度对于被模拟对象来说应当是有意义的。例如,提取单个元素的操作对于某些序列来说是适宜的,但提取切片可能就没有意义。(这种情况的一个实例是 W3C 的文档对象模型中的 NodeList
接口。)