Возвращает тот же тип, который вызывается при наследовании переопределенных операторов - PullRequest
0 голосов
/ 31 января 2020

Представьте себе такую ​​ситуацию в 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? Или есть более умный и чистый способ заставить это работать?

Спасибо.

1 Ответ

1 голос
/ 31 января 2020

вместо звонка A(...) звоните type(self)(...). type(self) вернет класс текущего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...