Python: наследование типов без перегрузки одноименного метода? - PullRequest
0 голосов
/ 28 мая 2020

возможно ли добиться наследования типов без перезаписи методов класса? Возьмите, например, этот код:

class Parent:
    def special_method(self, name):
        print("hello, {}!".format(name))

class Child:
    def __init__(self, injected_parent):
        self.parent = injected_parent

    def special_method(self):
        self.parent.special_method("Homer Simpson")



parent = Parent()
child = Child(parent)

child.special_method()
# hello, Homer Simpson!

Работает, как ожидалось, но я хочу, чтобы тип child был Parent, а не Child:

print(type(child))
<class '__main__.Child'>

В одну сторону Я видел, как это было сделано, чтобы расширить Child с помощью:

class Child:
    def __init__(self, injected_parent):
        self.parent = injected_parent
        self.__class__ = Parent
...

Однако тогда child s special_method перезаписывается:

parent = Parent()
child = Child(parent)

child.special_method()
# TypeError: special_method() missing 1 required positional argument: 'name'

Любой способ сделать child имеют тип Parent без побочных эффектов?

1 Ответ

0 голосов
/ 29 мая 2020

Похоже, что вы хотите сделать просто обычное наследование, но, как указал @ juanpa.arrivillaga, вместо этого вы используете композицию. То, что вы пытаетесь сделать, изменив метод перегрузки __class__ и , не сработает. Вот пример использования наследования, которое позволит вам перегрузить метод, сохраняя при этом доступ к исходному методу, и иметь child экземпляром parent, который, кажется, соответствует вашим требованиям:

class Parent:
    def special_method(self, name):
        print("hello, {}!".format(name))

class Child(Parent):
    def special_method(self):
        super().special_method("Homer Simpson")

child = Child()

Теперь child по-прежнему будет иметь тип из Child, но с классами вы хотите вместо этого проверять, является ли он экземпляром суперкласса с использованием isinstance:

>>> child.special_method()
hello, Homer Simpson!

>>> type(child)
<class '__main__.Child'>

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