代码之家  ›  专栏  ›  技术社区  ›  Thor

python运算符重载radd和add__

  •  0
  • Thor  · 技术社区  · 7 年前

    我正在学习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

    单独使用时,我明白 _拉德__ _添加__ 作品。但为了排队 x + y ,我不知道为什么 _拉德__ _添加__ 方法是诱发的。

    1 回复  |  直到 7 年前
        1
  •  2
  •   abarnert    7 年前

    首先,python查看 x y 决定是否打电话 x.__add__ y.__radd__ .因为他们都是同一类型的 Commuter1 ,它尝试 加上__ 第一。


    然后,在你的内心 __add__ 方法,执行以下操作:

    return self.val + other
    

    所以,python查看 self.val other 决定是否打电话 self.val.__add__ other.__radd__ .因为他们是不相关的类型 int 通勤1 ,它尝试 int.__add__ 第一。

    但是 内加__ 回报 NotImplemented 对于它不知道的类型,python会返回到调用 其他。__ .


    在你的内心 __radd__ 方法,执行以下操作:

    return other + self.val
    

    所以,python查看 其他 自我价值 决定是否打电话 other.__add__ self.val.__radd__ 是的。因为他们都是同一类型的 内景 ,它尝试 _添加__ 第一。


    当然还有 内加__ 在另一个上面工作 内景 ,因此它返回内部 + 在你的内心 _拉德__ ,它返回 + 里面 _添加__ ,它返回一个顶级的值 + ,您可以打印。