展开全部
图二是递归的问题
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__方法则抛出异常。