【问题标题】:Does the order of addition expressions matter in Python?Python中加法表达式的顺序是否重要?
【发布时间】:2015-04-16 04:32:59
【问题描述】:

这听起来有点愚蠢,但我不是在谈论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
>>>

我不明白为什么第一个返回错误而第二个工作正常

【问题讨论】:

    标签: python methods


    【解决方案1】:

    不假定加法是可交换的——例如,[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 来命名的。

    【讨论】:

    • 只有当左边的__add__失败时才调用__radd__
    • @jakekimds:如果右操作数的类型是左操作数类型的子类,则首先尝试__radd__。否则,__radd__ 仅在左操作数无法处理操作时尝试。
    【解决方案2】:

    是的,顺序很重要。

    第一种情况,调用了int__add__方法(它当然不知道怎么给自己添加一个非数字类的实例);第二种情况,调用num__add__方法。

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

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 2016-07-26
      • 2012-03-03
      • 1970-01-01
      • 2020-02-23
      • 2010-10-22
      • 2015-05-22
      • 1970-01-01
      • 2018-06-06
      相关资源
      最近更新 更多