Представьте себе такую ситуацию в Python:
class A:
def __init__(self, v):
self.val = v
def __add__(self, b):
return A(self.val + b.val)
class B(A):
def __init__(self, v):
super().__init__(v)
Очевидно, что B наследует переопределение оператора __add__
от своего родителя, A.
Если у меня есть несколько экземпляров этих объекты и выполнить некоторое сложение:
foo = A(3)
bar = B(4)
baz = B(5)
alp = foo + foo
bet = foo + bar
gam = bar + baz
alp
имеет тип A
, что ожидается. bet
также делает, что, возможно, менее ожидаемо, но не удивительно.
gam
имеет тип A
, что раздражает, потому что мы добавили два экземпляра B
, чтобы получить это.
Мой вопрос: как это можно сделать, чтобы gam
имел тип B
? Требуется ли переопределение каждого оператора (например, __add__
) на B явно, чтобы привести результат super().__add__(b)
к типу B? Или есть более умный и чистый способ заставить это работать?
Спасибо.