python中iadd与add_python类实例中__add__和__radd__的触发顺序问题

展开全部

图二是递归的问题

x + i实际上是x.__add__(i)

所以会执行第五行,而第五行是一条输出语句,62616964757a686964616fe4b893e5b19e31333365656633但它的第二个参数是一个表达式(self.num + other),所以会先进行表达式的运算,然后再将"add"字符串和表达式的结果一起传给print。

先输出radd问题的原因就在于这个表达式。

之前提到x + i实际上是x.__add__(i),other参数实际上是i,所以self.num + other实际上是90 + i。

而i是A的实例,你给他定义了__radd__方法,而这就造成了90 + i和i.__radd__(90)等价。

90被传入i的__radd__方法和i持有的num相加,结果为170,并和"radd"字符串一并打印出来。然后方法结束,None被返回到x的add方法中,然后和"add"字符串一并打印出来。

一言以蔽之,在x的__add__中调用了i的__radd__。

“加号左边的实例简化为数字”,A是你自己定义的类,你都没写转化的代码,是要Python猜出你的想法把A的实例转化成数字吗?

“python优先选择左侧的那个类”,简而言之,优先找左边实例的__add__方法,左边实例没有__add__方法时找右边实例的__radd__方法,如果右边实例没有__radd__方法则抛出异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值