python: перегрузка сложения и т.д. для родительского класса, но возвращение результата как от дочернего

подскажите как корректно решить следующую ситуацию:

есть базовый класс MyBaseClass с перегруженным оператором __add__

и есть дочерний класс MyChildClass, который в конструкторе выставляет свои параметры, а большая часть функций уже от базового класса

в итоге:

class MyBaseClass:
    def __add__(self, other):
        return MyBaseClass(...) # тут вычисляю необходимые параметры из self и other

class MyChildClass(MyBaseClass):
    def __init__(self, ...):
        # тут устанавливаю необходимые параметры 

В результате когда я делаю

a = MyChildClass(...)
b = MyChildClass(...)

c = a + b

то type(c) выдаёт, что это MyBaseClass

Вопрос - а как сделать, чтобы это был именно MyChildClass? Без переноса кода в MyBaseClass конечно же иначе какой смысл в базовом


Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Динамически вызывайте нужный конструктор:

class MyBaseClass:
    def __init__(self, val):
        self.val = val

    def __add__(self, other):
        return type(self)(self.val + other.val)

    def __str__(self):
        return f"{type(self).__name__}({self.val})"

class MyChildClass(MyBaseClass):
    def __init__(self, val):
        super().__init__(val)


a = MyChildClass(1)
b = MyChildClass(2)

c = a + b

print(c)
→ Ссылка