添加表达式的顺序在Python中是否重要?

时间:2015-04-16 04:33:00

标签: python methods

这听起来有点愚蠢,但我不是在谈论1 + 2 = 2 + 1。我在谈论将具有__add__方法的对象添加到数字的位置。一个例子是:

>>> class num:
...     def __add__(self,x):
...             return 1+x
... 
>>> n = num()
>>> 1+n
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'instance'
>>> n+1
2
>>>

我不明白为什么第一个返回错误而第二个像普通

一样

2 个答案:

答案 0 :(得分:8)

不假设添加是可交换的 - 例如,[1] + [2] != [2] + [1] - 因此,当您的对象位于+的右侧时,您需要实现一个单独的方法。左不知道如何处理它。

def __radd__(self, other):
    # Called for other + self when other can't handle it or self's
    # type subclasses other's type.

所有其他二元操作都存在类似的方法,所有操作都是通过在同一位置粘贴r来命名的。

答案 1 :(得分:4)

是的,订单很重要。

在第一种情况下,调用__add__的{​​{1}}方法(当然不知道如何向自身添加非数字类的实例);在第二种情况下,调用int的{​​{1}}方法。

如果__add__方法失败,那么Python可以检查user2357112指出的替代方案。