Operator Overloading
操作符重载可以让你自己定义的类拥有类似内置对象的接口,但其行为取决于你对相应函数的定义。例如列表的索引接口
In [1]: li = range(10)
In [2]: li
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [3]: li[3]
Out[3]: 3
但是如果你自己定义的类,比如class Foo()
也想用[]
这种借口怎么办呢。这就需要利用操作符重载了。要了解运算符重载需要以下要点:
- Python为内置对象的接口定义了一系列的方法,例如实现上述索引接口(
[]
)的__getitem__()
方法,具体的源码没有了解 - 当用户也想用这种索引接口(
[]
)时,可以在自己的类中定义__getitem__
方法,该方法的行为取决于用户的定义 *当定义了__getitem__()
的类的实例使用[]
接口时,Python会调用用户定义的__getitem__
方法,而不是内置的__getitem__
例如
In [1]: class Indexer:
...: def __getitem__(self, index):
...: return index ** 2
...:
In [2]: x = Indexer()
In [3]: x[2]
Out[3]: 4
In [4]: for i in range(5):
...: print x[i]
...:
0
1
4
9
16
这就是操作符重载,核心就是内置类接口,对应的方法,用户在自定义类中定义的同名方法响应该接口。因此,要利用运算符重载,用户需要知道内置类接口和其对应的实现方法,详细内容可以参考Learning Python, 5th Edition Chapter 30: Operator Overloading