python运算符重载__radd__和__add __

时间:2018-07-12 06:21:34

标签: python operator-overloading

我目前正在学习python运算符重载(确切地说是__radd____add__),我有以下代码

class Commuter1:
    def __init__(self, val):
        self.val = val
    def __add__(self, other):
        print('add', self.val, other)
        return self.val + other


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


x = Commuter1(88)
y = Commuter1(99)

print(x + y)

我得到了以下结果

enter image description here

单独使用时,我了解__radd____add__的工作方式。但是对于行x + y,我不确定为什么同时引发了__radd____add__方法。

1 个答案:

答案 0 :(得分:2)

首先,Python查看xy的类型,以确定是调用x.__add__还是y.__radd__。由于它们都是同一类型Commuter1,因此它将首先尝试x.__add__


然后,在您的__add__方法中,执行以下操作:

return self.val + other

因此,Python会查看self.valother的类型,以确定是调用self.val.__add__还是other.__radd__。由于它们是intCommuter1无关的类型,因此它首先尝试int.__add__

但是int.__add__返回的NotImplemented是未知类型,因此Python会回退到调用other.__radd__


在您的__radd__方法中,您可以执行以下操作:

return other + self.val

因此,Python会查看otherself.val的类型,以确定是调用other.__add__还是self.val.__radd__。由于它们都是同一类型int,因此它将首先尝试__add__


当然,int.__add__适用于另一个int,因此它返回+内的内部__radd__的值,并返回该值,该值将返回返回的+内的__add__,将返回您打印的顶层+的值。