在实现过程中需要遵循这些运算符的一个基本规则:始终返回一个新对象!也就是说不能修改self,要创建并返回合适类型的实例。以下补充两个Vector类的运算符重载:
def __neg__(self): return Vector(-x for x in self)def __pos__(self): return Vector(self)复制代码x和+x何时不等?以下是两个例子:
5.1 重载 ==之前版本的Vector中,__eq__的实现与行为如下:
def __eq__(self, other): return (len(self) == len(other) and all(a == b for a, b in zip(self, other)))# 它的行为如下:>>> Vector([1, 2, 3]) == (1, 2, 3) # 除此之外还能和Vector与Vector2d比较True复制代码有时候我们并不想兼容这么多类型的操作数,但当遇到某些类型时(比如上面的元组),我们也不想武断地直接抛出TypeError,而是让另一个操作数判断这俩是否相等,于是我们将上述代码改为如下形式:
def __eq__(self, other): if isinstance(other, Vector): return (len(self) == len(other) and all(a == b for a, b in zip(self, other))) else: return NotImplemented# 它的行为如下:>>> va = Vector([1, 2, 3])>>> t3 = (1, 2, 3)>>> va == t3False复制代码以下是Vector([1, 2, 3]) == (1, 2, 3)这段代码的运行过程: