python中的运算符重载,对象位于运算符的右侧

python中的运算符重载,对象位于运算符的右侧,python,operator-overloading,Python,Operator Overloading,我最近学习了python中的运算符重载,我想知道下面的内容是否可行 考虑以下假设/人为类别 class My_Num(object): def __init__(self, val): self.val = val def __add__(self, other_num): if isinstance(other_num, My_Num): return self.val + other_num.val el

我最近学习了python中的运算符重载,我想知道下面的内容是否可行

考虑以下假设/人为类别

class My_Num(object):
    def __init__(self, val):
        self.val = val
    def __add__(self, other_num):
        if isinstance(other_num, My_Num):
            return self.val + other_num.val
        else:
            return self.val + other_num
我知道按照上面写的方式,我可以做这样的事情

n1 = My_Num(1)
n2 = My_Num(2)
n3 = 3
print n1 + n2
print n1 + n3
这些都将如预期的那样起作用。我也知道,以目前的写作方式,我无法做到这一点

n1 = My_Num(1)
n2 = 2
print 2 + n1

这有什么关系吗?我知道这个例子是人为设计的,但我有一个应用程序,在这个应用程序中,如果我进行运算符重载时,我为其定义运算符的类可以出现在运算符的右侧,它将非常有用。这在python中可能吗?

是的。例如,有。同样,对于
\uuu le\uuu()
\uu ge\uuuu()
等,但正如Joel Cornett正确地观察到的那样,如果您只定义
\uu lt\uuuu
a>b
调用
b
\uu lt\uu>/code>函数,这提供了一种解决方法

>>> class My_Num(object):
...     def __init__(self, val):
...         self.val = val
...     def __radd__(self, other_num):
...         if isinstance(other_num, My_Num):
...             return self.val + other_num.val
...         else:
...             return self.val + other_num
... 
>>> n1 = My_Num(1)
>>> n2 = 3
>>> 
>>> print n2 + n1
4
>>> print n1 + n2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'My_Num' and 'int'

您必须重载
\uuuu radd\uuuu
方法(右侧添加)。你的函数应该与你的
\uuuuu add\uuuu
方法非常相似,例如:

def __radd__(self, other):
     return self.val + other.val

谢谢radd是唯一允许这样做的人吗?我需要为我的应用程序重载的特定运算符是>>和Nope。你点击链接了吗?有
\uuu rrshift\uuu
等等。通过控制为每个类定义的运算符,可以在有限的范围内进行右比较。例如,如果A和B仅定义了lt。AA将调用属于小端的方法。是否有任何方法可以更改opeartor的关联性?例如,我能使>>操作符正确关联吗?@martega,我非常怀疑这一点。但我真的不知道。
def __radd__(self, other):
     return self.val + other.val