Выполнение функций инициализации при множественном наследовании в python - PullRequest
0 голосов
/ 14 июля 2020

Я новичок в python и пытаюсь понять наследование в python. Python имеет функцию множественного наследования. Один класс может одновременно наследовать более одного класса. Когда мы создаем объект дочернего класса, вызывается функция init дочернего класса. Я хочу вызвать функцию инициализации как родительского класса, так и дочернего, но я могу вызвать только одну функцию инициализации. Я прочитал концепцию порядка разрешения методов, с помощью которой будет вызываться унаследованная функция инициализации от самого левого класса. Исправьте мой код, чтобы вызывалась функция инициализации обоих родительских классов.

class A:
    def __init__(self):
        print("in A Init")
    

class B:
    def __init__(self):
        print("in B Init")

    


class C(B,A):
    def __init__(self):
        super().__init__()
        print("in C Init")

cObj= C()

1 Ответ

3 голосов
/ 14 июля 2020

Все функции __init__ должны вызывать super().__init__(), например:

class A:
    def __init__(self):
        super().__init__()
        print("in A Init")

class B:
    def __init__(self):
        super().__init__()
        print("in B Init")

class C(B, A):
    def __init__(self):
        super().__init__()
        print("in C Init")

c_obj= C()

Согласно документации функции super() он возвращает ссылку на «родительский or sibling »класса, в зависимости от того, что будет следующим в порядке разрешения метода. На вершине иерархии он возвращает ссылку на неявный родительский класс object, который имеет пустой метод __init__, который ничего не делает.

Для того, чтобы это работало хорошо, это лучше всего для всех унаследованные функции __init__ должны иметь одинаковую сигнатуру, включая общий базовый класс; в этом случае подпись равна __init__(self) (без дополнительных аргументов), а общий базовый класс - object, который также имеет __init__(self) без дополнительных аргументов, так что все в порядке. Другой распространенный шаблон - все они принимают аргументы ключевого слова и передают **kwargs следующему.

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