【问题标题】:python operator overloading __radd__ and __add__python运算符重载__radd__和__add__
【发布时间】:2018-07-12 06:21:33
【问题描述】:

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

我得到了以下结果

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

【问题讨论】:

  • 你认为self.val + other会发生什么?
  • 我想他已经回答了你的问题。
  • 啊,我想我明白了。在__add__ 函数内部,返回语句return self.val + other 调用__radd__ 函数。 return self.val + other 中的other 作为第一个参数传递给__radd__(即return self.val + other 中的other 被分配给def __radd__(self, other) 中的self。而return self.val + other 中的self.val 被分配给def __radd__(self, other) 中的 other 参数。我希望我做对了

标签: python operator-overloading


【解决方案1】:

首先,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__ 中的+ 返回一个值,您返回,它会返回您打印的顶级+ 的值。

【讨论】:

  • @Thor 没问题;当您尝试制定复杂的规则时,它首先尝试 __add__ 还是 __radd__,以及什么强制执行和不强制回退,很容易忽略正在发生的事情的简单部分…
  • 你介意我问一下,你是怎么学到这一切的吗?我想知道我是否可以从你的学习经历中吸取任何教训,以便我以后可以尝试自己解决类似的问题。
  • @Thor 我可能有点晚了,但是如果您不知道在哪里搜索,从 Python 中查看官方文档是一个不错的开始。除此之外,它主要是经验和阅读其他人做的事情。对于这种情况,可以在此处找到文档:docs.python.org/3/reference/datamodel.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多