Значения init не наследуются другому классу с помощью super () - PullRequest
0 голосов
/ 17 октября 2019

Я построил 2 класса. первый класс со своим собственным значением init, а другой класс будет наследовать значения init из первого класса. Мне интересно, правильно ли я понимаю использование super ().

class testing(testing_2):
    def __init__(self, name, c):
        super().__init__(name, c)

    def check(self):
        print(super().name)

class testing_2:
    def __init__(self, name, c):
        self.name = name
        self.c = c

tt = testing("tester", "check")
tt.check()

Я подумал, что мой код предположительно напечатан как "тестер", потому что я инициализирую класс тестирования с именами и c. поскольку тестируемый класс наследуется от testing_2, мы можем просто напечатать имя. Я что-то путаю?

Я ожидаю:

testing_2 получит значение из тестирования, и мы можем напечатать значения testing_2 при тестировании.

1 Ответ

1 голос
/ 17 октября 2019

Упростите это:

class A:
    def __init__(self, name, c):
        self.name = name
        self.c = c


class B(A):
    def check(self):
        print(self.name)


tt = B("tester", "check")
tt.check()

Объект B будет иметь все то же самое, что и объект A, поскольку он наследует их. Не нужно реализовывать __init__ на B, если это не поможет. Вы можете получить доступ к self.name напрямую, как и в A. Объект с таким свойством self. Он установлен на self, и вы можете получить к нему доступ с помощью self.

Помните, self - это экземпляр объекта , а не класс. При выполнении B(...), self в A.__init__(self, ...) фактически является экземпляром B.

Вам необходимо явно использовать super только если вы переопределяете родительские методы, как в:

def __init__(self, name, c):
    super().__init__(name, c)

Здесь __init__ является переопределенным , и для выполнения __init__ родителя необходимо получить к нему доступ через super. Просто self.__init__(name, c) получит доступ к дочернему методу __init__, и вы вызовете его в бесконечном рекурсивном цикле.

...