Python交换运算符覆盖

时间:2017-02-06 15:50:33

标签: python operators override symmetry

您好我想知道是否有办法在Python中执行对称运算符覆盖。例如,我们说我有一个班级:

class A:
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        if isinstance(other, self.__class__):
            return self.value + other.value
        else:
            return self.value + other

然后我可以做:

a = A(1)
a + 1

但如果我尝试:

1 + a

我收到错误。 有没有办法覆盖运算符添加,以便1 + a可以工作?

1 个答案:

答案 0 :(得分:5)

只需在班级中实施__radd__方法即可。一旦int类无法处理添加,__radd__如果实现,就会接受它。

class A(object):
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        if isinstance(other, self.__class__):
            return self.value + other.value
        else:
            return self.value + other

    def __radd__(self, other):
        return self.__add__(other)


a = A(1)
print a + 1
# 2
print 1 + a
# 2
  

例如,要评估表达式x-y,其中y是一个实例   如果__rsub__()返回y.__rsub__(x),则会调用具有x.__sub__(y)方法的类NotImplemented

同样适用于x + y

在旁注中,您可能希望您的类继承object。见What is the purpose of subclassing the class "object" in Python?