13

嗨,我想知道是否有办法在 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

我得到一个错误。有没有办法覆盖运算符add以便 1 + a 起作用?

4

1 回答 1

15

只需__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。请参阅在 Python 中对类“对象”进行子类化的目的是什么?

于 2017-02-06T15:54:55.343 回答