Родительский метод перезаписывается дочерним - PullRequest
0 голосов
/ 03 октября 2018

Допустим, у нас есть:

class Parent():
    def __init__(self):
        foo()

    def foo(self):
        //do stuff

class Child(Parent):
    def __init__(self):
        Parent.__init__()

class Grandchild(Child):
    def __init__(self):
        Child.__init__()

    def foo(self):
        //different stuff

На уровне Child есть много классов, которые используют один и тот же foo().Уровень Grandchild имеет немного другую версию foo, но когда инициируется Grandchild, вызов foo() в Parent.__init__() использует Parent.foo() вместо Grandchild.foo().

Есть липравильная практика, когда дело доходит до такой ситуации?

1 Ответ

0 голосов
/ 03 октября 2018

Вы не вызываете методы __init__() базовых классов должным образом - вам нужно передать им аргумент self:

class Parent:
    def __init__(self):
        self.foo()

    def foo(self):
        print('Parent stuff')

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)

class Grandchild(Child):
    def __init__(self):
        Child.__init__(self)

    def foo(self):
        print('Grandchild stuff')

if __name__ == '__main__':
    gc = Grandchild()  # -> Grandchild stuff

Если вы используете super() вместо явного указаниябазовый класс, вам не нужно этого делать:

class Parent:
    def __init__(self):
        self.foo()

    def foo(self):
        print('Parent stuff')

class Child(Parent):
    def __init__(self):
#        Parent.__init__(self)
        super().__init__()

class Grandchild(Child):
    def __init__(self):
#        Child.__init__(self)
        super().__init__()

    def foo(self):
        print('Grandchild stuff')

if __name__ == '__main__':
    gc = Grandchild()  # -> Grandchild stuff

Другое преимущество состоит в том, что вам, скорее всего, не придется изменять код в методе подкласса '__init__(), если вы изменили его базовый класс..

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