在Python中使用反向运算符

Ran*_*dy 8 python operators

我以前从未处理过反向操作员,所以请不要燃烧!刚刚完成了解它们,所以想尝试一下.但由于某种原因,它不起作用.这是代码:

>>> class Subtract(object):
    def __init__(self, number):
        self.number = number
    def __rsub__(self, other):
        return self.number - other.number


>>> x = Subtract(5)
>>> y = Subtract(10)
>>> x - y         # FAILS!

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    x - y
TypeError: unsupported operand type(s) for -: 'Subtract' and 'Subtract'
>>> x.__rsub__(y) # WORKS!
-5
Run Code Online (Sandbox Code Playgroud)

如果我改变__rsub____sub__,它的工作原理.

我究竟做错了什么?这些反向运营商的目的是什么?

Woo*_*ble 6

__rsub__()仅当操作数是不同类型时才被调用;当它们是相同类型时,假定如果__sub__不存在,则不能将它们相减。

还要注意,无论如何您的逻辑都是相反的。你正在返回自我-其他而不是其他-自我


Joc*_*zel 5

这些方法的重点是允许这样做:

class MyNumber(object):
    def __init__(self, x):
        self.x = x

print 10 - MyNumber(9) # fails because 10.__sub__(MyNumber(9)) is unknown

class MyFixedNumber(MyNumber):
    def __rsub__(self, other):
        return MyNumber( other - self.x )

print 10 - MyFixedNumber(9) # MyFixedNumber(9).__rsub__(10) is defined
Run Code Online (Sandbox Code Playgroud)

虽然很少有用,但通常你只是使用相同类型的东西和直接 __sub__