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

results matching ""

    No results matching ""