Python 中正向和反向使用的都是同一系列方法。例如,对 == 而言,正向和反向调用都是 __eq__ 方法,只是把参数对调了,而 >,<,>=,<=,正向的 __gt__ 方法调用的是反向的 __lt__ 方法,并把参数对调。对 == 和 != 来说,如果反向调用失败,Python 会比较对象的ID,而不是抛出 TypeError。
如下:
def __eq__(self, other):
if isinstance(other, Vector): # <1>
return (len(self) == len(other) and
all(a == b for a, b in zip(self, other)))
else:
return NotImplemented # <2>
Tests of operator `==`::
>>> va = Vector(range(1, 4))
>>> vb = Vector([1.0, 2.0, 3.0])
>>> va == vb
True
>>> vc = Vector([1, 2])
>>> from vector2d_v3 import Vector2d
>>> v2d = Vector2d(1, 2)
>>> vc == v2d
True
>>> va == (1, 2, 3)
False
第一个 va == vb 的比较是 True,正常。
第二个 是 Vector 实例和 Vector2d 实例比较,步骤如下:
1. 为了计算 vc == v2d,Python 调用 Vector.__eq__(vc,v2d)
2. 经 Vector.__eq__(vc,v2d)确认,v2d 不是 Vector 实例,因此返回 NotImplemented
3. Python 得到 NotImplemented 结果,尝试调用 Vector2d.__eq__(vc,v2d)
4. Vector2d.__eq__(v2d,vc) 把两个操作数都变成元组,然后比较,结果是 True
第三个,Vector 实例和元组比较时,步骤如下:
1. 为了计算 va == t3,Python调用 Vector.__eq__(va,t3)
2. 经 Vector.__eq__(va,t3) 确认,t3 不是 Vector 实例,因此返回 NotImplemented
3. Python 得到 NotImplemented 结果,尝试调用 tuple.__eq__(t3,va)
4. tuple.__eq__(t3,va) 不知道 Vector 是什么,因此返回 NotImplemented.
5. 对 == 来说,如果反向调用返回 NotImplemented,Python 会比较对象的ID。
!= 运算符,很简单,定义了 __eq__ 方法,而且它不返回 NotImplemented,__ne__ 会对__eq__返回的结果取反。
如下:
def __ne__(self,other):
eq_result = self = other
if eq_result is NotImplemented:
return NotImplemented
else:
return not eq_result