@ user2357112 уже хорошо сказал, но нет ничего похожего на пример.
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
Объекты a1
и a2
совместимы (оба типа A
), верный результат возвращается.
Далее рассмотрим,
b - a1
B.__sub__
A.__rsub__
# TypeError: unsupported operand type(s) for -: 'B' and 'A'
Объекты b
и a1
несовместимы.Сначала пробуется b.__sub__
, что возвращает NotImplemented
, поэтому пробуется a1.__rsub__
, что также возвращает NotImplemented
.Итак, TypeError
поднято.
Наконец,
a1 - b
A.__sub__
# TypeError: unsupported operand type(s) for -: 'A' and 'B'
На этот раз сначала пробуется a1.__sub__
, что возвращает NotImplemented
.Теперь, поскольку b.__rsub__
не определено, TypeError
повышается.