When I subtract a float from an integer (e.g. 1-2.0
), Python does implicit type conversion (I think). But when I call what I thought was the same operation usin
@user2357112 already said it well but there's nothing like an example.
class A:
def __sub__(self, other):
print('A.__sub__')
if not isinstance(other, A):
return NotImplemented
return 0
def __rsub__(self, other):
print('A.__rsub__')
if not isinstance(other, A):
return NotImplemented
return 0
class B:
def __sub__(self, other):
print('B.__sub__')
if not isinstance(other, B):
return NotImplemented
return 0
a1 = A()
a2 = A()
b = B()
a1 - a2
A.__sub__
# 0
Objects a1
and a2
are compatible (both type A
), a valid result is returned.
Next, consider,
b - a1
B.__sub__
A.__rsub__
# TypeError: unsupported operand type(s) for -: 'B' and 'A'
Objects b
and a1
are not compatible. First, b.__sub__
is tried, which returns NotImplemented
, so a1.__rsub__
is tried, which also returns NotImplemented
. So a TypeError
is raised.
Finally,
a1 - b
A.__sub__
# TypeError: unsupported operand type(s) for -: 'A' and 'B'
This time, a1.__sub__
is tried first, which returns NotImplemented
. Now, since b.__rsub__
is not defined, a TypeError
is raised.