一个类可以通过定义具有特殊名称的方法来实现由特殊语法所引发的特定操作 (例如算术运算或下标与切片)。
这是 Python 实现 操作符重载 的方式,允许每个类自行定义基于操作符的特定行为。例如,如果一个类定义了名为
__getitem__()
的方法,并且x
为该类的一个实例,则x[i]
基本就等同于type(x).__getitem__(x, i)
。除非有说明例外情况,在没有定义适当方法的情况下尝试执行一种操作将引发一个异常 (通常为AttributeError
或TypeError
)。将一个特殊方法设为
None
表示对应的操作不可用。例如,如果一个类将__iter__()
设为None
,则该类就是不可迭代的,因此对其实例调用iter()
将引发一个TypeError
(而不会回退至__getitem__()
).在实现模拟任何内置类型的类时,很重要的一点是模拟的实现程度对于被模拟对象来说应当是有意义的。例如,提取单个元素的操作对于某些序列来说是适宜的,但提取切片可能就没有意义。(这种情况的一个实例是 W3C 的文档对象模型中的
NodeList
接口。)
object.
__new__
(cls[, ...])调用以创建一个 cls 类的新实例。
__new__()
是一个静态方法 (因为是特例所以你不需要显式地声明),它会将所请求实例所属的类作为第一个参数。其余的参数会被传递给对象构造器表达式 (对类的调用)。__new__()
的返回值应为新对象实例 (通常是 cls 的实例)。典型的实现会附带适宜的参数使用
super().__new__(cls[, ...])
,通过超类的__new__()
方法来创建一个类的新实例,然后根据需要修改新创建的实例再将其返回。如果
__new__()
在构造对象期间被发起调用并且它返回了一个实例或 cls 的子类,则新实例的__init__()
方法将以__init__(self[, ...])
的形式被发起调用,其中 self 为新实例而其余的参数与被传给对象构造器的参数相同。如果
__new__()
未返回一个 cls 的实例,则新实例的__init__()
方法就不会被执行。
__new__()
的目的主要是允许不可变类型的子类 (例如 int, str 或 tuple) 定制实例创建过程。它也常会在自定义元类中被重载以便定制类创建过程。
object.
__init__
(self[, ...])在实例 (通过
__new__()
) 被创建之后,返回调用者之前调用。其参数与传递给类构造器表达式的参数相同。一个基类如果有__init__()
方法,则其所派生的类如果也有__init__()
方法,就必须显式地调用它以确保实例基类部分的正确初始化;例如:super().__init__([a