У меня есть базовый класс с двумя производными классами. Я хочу, чтобы методы базовых классов вели себя по-разному, в зависимости от того, относятся ли аргументы к тому же типу, что и производный класс, или только к экземплярам базового класса, но другого типа. Это текущая реализация:
class MyBase:
def __init__(self, foo: int):
self.foo = foo
def __eq__(self, other):
return self.foo == other.foo
class MyDerived_1(MyBase):
def __init__(self, foo: int, bar: int):
super().__init__(foo)
self.bar = bar
class MyDerived_2(MyBase):
def __init__(self, foo: int, bar: int):
super().__init__(foo)
self.bar = bar
def __eq__(self, other):
if type(other) == type(self):
return self.bar == other.bar
elif isinstance(other, MyBase):
return super().__eq__(other)
else:
return False
В четвертой последней строке я должен явно ссылаться на MyBase. Возможно, это нормально, но я понимаю, что основной смысл ключевого слова "super" заключается в том, что оно должно позволять вам изменять базовый класс без необходимости что-либо переписывать в классе. То есть потенциальная проблема с этим решением состоит в том, что если MyBase будет изменен, то init будет в порядке, потому что он вызывает «super», но eq не будет обновлять свое поведение.
Поэтому я попытался заменить «MyBase» на «type (super)» или «type (super ())», но они не ссылаются на суперкласс, они ссылаются на класс объекта «super».
Обратите внимание, что этот вопрос отличается от:
Получить имя родительского класса?
Получить определяющий класс несвязанного объекта метода в Python 3
и т.д.
Потому что они ищут родительские классы после инициализации объекта.
Полагаю, я смогу найти суперкласс, запустив MRO. Но это кажется плохим решением, учитывая, что я не ищу целое дерево наследования, я просто хочу знать тип суперкласса.
Есть ли способ извлечь эту информацию из "супер"?