如何在Python中实现列表与自定义Vector类的双向加法运算
解决Vector类与列表的双向加法问题
嘿,这个问题我太熟悉了!咱们先搞清楚为什么list + vector会报错,再一步步搞定它。
问题根源
当你执行vector + list时,Python会调用vector类的__add__方法,你的代码已经能处理这种情况(只要长度匹配)。但反过来写list + vector时,Python会先尝试调用list自带的__add__方法——可list的加法只认同类型对象,它根本不知道怎么处理vector实例,自然就报错了。
这时候就得用到Python运算符重载里的**反向加法方法__radd__**了!
解决方案:实现__radd__方法
__radd__的作用是:当左侧对象的__add__无法处理右侧的vector时,Python会自动调用右侧vector的__radd__,把左侧的对象(比如这里的list)作为参数传进来。
而且向量加法满足交换律,我们可以直接复用已有的__add__逻辑,不用重复写代码:
def __radd__(self, other): # 反向加法直接复用__add__的逻辑,相当于把other和self交换后执行加法 return self + other
把这个方法加到你的vector类里,list + vector就能正常运行了!
优化建议(可选)
另外,你原来用print提示错误的方式不够规范,更好的做法是抛出异常,这样能让程序更健壮:
比如把__add__里的:
if(len(self)!= len(other)): print("Don't add these too ! they are not same types :P")
改成:
if len(self) != len(other): raise ValueError("Cannot add vectors of different lengths")
修改后的完整代码
class vector: """Initialize Vector""" def __init__(self,d): self.coords = [0]*d def __len__(self): return len(self.coords) def __getitem__(self, item): #Getting an item from a vector return self.coords[item] def __setitem__(self, key, value): self.coords[key] = value def __add__(self, other): if len(self) != len(other): raise ValueError("Cannot add vectors of different lengths") else: result = vector(len(self)) for i in range(len(result)): result[i] = self[i] + other[i] return result def __radd__(self, other): # 实现反向加法,支持list + vector return self + other def __sub__(self, other): if len(self) != len(other): raise ValueError("Cannot subtract vectors of different lengths") else: result = vector(len(self)) for i in range(len(result)): result[i] = self[i] - other[i] return result def __eq__(self, other): return self.coords == other.coords def __ne__(self, other): return self.coords != other.coords def __str__(self): return '<'+ str(self.coords)[1:-1] +'>' print("Input for vector 1") x = vector(2) for i in range(len(x)): x[i] = int(input('Enter a number\n')) print("Input for vector 2") y = vector(2) for i in range(len(y)): y[i] = int(input('Enter a number\n')) z = x-y print(str(x)) print(" + ") print(str(y)) print(" = ") print(str(z)) # 测试list + vector test_list = [5, 6] print("\n测试list + vector:") print(test_list + x)
现在你试试运行test_list + x,就能得到正确的向量结果啦!
内容的提问来源于stack exchange,提问作者Dinesh Pabbi
相关产品推荐
相关产品推荐

