2016-03-01 89 views
1

我有一个矢量类,它给出了一个带有列表的向量,我需要能够向列表,元组和字符串添加向量或向量。如果它们长度不一样,我需要抛出一个类型错误。输出的一些例子:python将2个对象或对象添加到列表中

Vector([6,8,2])+Vector([4,-3,2]) 
Vector([10, 5, 4]) 
>>> Vector([6,8,2])+[4,-3,2] 
Vector([10, 5, 4]) 
>>> (6,8,2)+Vector([4,-3,2]) 
Vector([10, 5, 4]) 
>>> v=Vector(["f","b"]) 
>>> v+=("oo","oo") 
>>> v 
Vector(['foo', 'boo']) 

我需要做一个+函数和一个+ =函数。

的Python方法做我用它来重写+和+ =操作,也是我需要确保我的+操作的对象和序列和反向

+0

你可以用'isinstance'来检查'other'参数的类型,例如'isinstance(other,Vector)' –

+0

我认为'__iadd__'方法是你正在寻找的(+ =案件)。 http://stackoverflow.com/questions/1047021/overriding-in-python-iadd-method –

+0

我让iadd为2个向量工作,我不知道为什么它不适用于向量和序列>>> v = Vector( [ “F”, “b”]) >>> v + =( “OO”, “OO”) 回溯(最近最后调用): 文件 “”,第1行,在 类型错误:不支持的操作数类型为+ =:'实例'和'元组' >>> –

回答

1

要全面落实以任意顺序串联上工作,you need to implement three methods, __add__, __radd__ and __iadd__。你根本没有执行__add__(所以Vector + sequence不工作,只有sequence + Vector使用__radd__)并且拼写错误__iadd____iadd(所以Vector += anything不工作)。

+0

哦,我没有注意到这一点。我收到它我加入与radd相同的确切实现,它的工作。 –

+0

@AnatoliySokolov:基本规则是当实例位于运算符的左侧时,调用二元运算符的普通'__xxx__'方法,当它位于右侧时调用__rxxx__',左侧的对象方的'__xxx__'不存在(或返回'NotImplemented'),并且在使用增广赋值操作符时调用__ixxx__。 '__ixxx__'是可选的;对于不可变类型,当__ixxx__缺失时,Python使用'__xxx__'。你可能想看看['collections.abc'接口](https://docs.python.org/3/library/collections.abc.html#module-collections.abc) – ShadowRanger

+0

@AnatoliySokolov:你可能也想要查看[实现算术运算](https://docs.python.org/3/library/numbers.html#implementing-the-arithmetic-operations),了解如何使用基于运算符回退的方法来避免大量重复码;它关注的是数学运算,但是相同的技术适用于序列运算,并且'fractions.Fraction'中给出的例子可以缩短代码量。 – ShadowRanger