Методы, относящиеся к классу Rational python

Я написал два метода, я до сих пор не вижу разницы между этими двумя методами. Мой класс отлично работает до сих пор, но поскольку методы написаны одинаково, я все еще не могу понять, почему, когда я делаю: x + 1 он вызывает добавление, и 1 + x он вызывает radd?

def __add__(self,other):
 assert isinstance(other,(Rational,int,str))
 other=Rational(other)
 n = self.n * other.d + self.d * other.n
 d = self.d * other.d
 return Rational(n, d)

def __radd__(self,other):
 assert isinstance(other,(Rational,int,str))
 other=Rational(other)
 n =self.d * other.n + other.d * self.n
 d=other.d * self.d
 return Rational(n, d)
2 ответа

Когда Python оценивает X+Y, он сначала вызывает

X.__add__(Y)

если это возвращает NotImplemented, то вызовы Python

Y.__radd__(X)

Этот пример демонстрирует, когда __radd__ или __add__:

class Commuter:
 def __init__(self,val):
 self.val=val
 def __add__(self,other):
 print 'Commuter add', self.val, other
 def __radd__(self,other):
 print 'Commuter radd', self.val, other

x = Commuter(88)
y = Commuter(99)
x+1
# Commuter add 88 1

1+y
# Commuter radd 99 1

x+y
# Commuter add 88 <__main__.Commuter instance at 0xb7d2cfac>

В этом случае:

In [3]: (1).__add__(y)
Out[3]: NotImplemented

Так y.__radd__(1).


Учитывая выражение a + b, если объект a реализует __add__ он будет вызываться с b:

a.__add__(b)

Однако, если не реализует __add__ и b реализует __radd__ (читается как "правый оных"), то b.__radd__ будет называться с: a

b.__radd__(a)

Документация, объясняющая это, приведена здесь.

licensed under cc by-sa 3.0 with attribution.