Python 关于运算符重载的规则:
不能重载内置类型的运算符
不能新建,只能重载
某些运算符不能重载--is、and、or 和 not
Python运算实际上是通过调用对象的特殊方法实现的,比如a+b:
a=20
b=30
c=a+b
d=a.__add__(b)
print("c:",c)
print("d:",c)运算结果:
c: 50 d: 50
Vector 对于乘法的重载也是类似的:
def __mul__(self, scalar):
if isinstance(scalar, numbers.Real):
return Vector(n * scalar for n in self)
else:
return NotImplemented
def __rmul__(self, scalar):
return self * scalar注意这里我们值定义了向量乘以一个数的乘法。尝试做点乘,矩阵乘法被分配给了@符号,我们也可以做这个定义,然后来运算
def __matmul__(self, other):
try:
return sum(a * b for a, b in zip(self, other))
except TypeError:
return NotImplemented
def __rmatmul__(self, other):
return self @ other # this only works in Python 3.5