Python: множественное наследование: почему переменная экземпляра суперкласса недоступна?

Это код, который я пытаюсь выполнить, в Line 1 изначально это был super().super().__init__(), который не работал (выдавал ошибку).

class A:
    def __init__(self):
        self.var1=5

class B(A):
    def __init__(self):
        self.var2=10

class C(B):
    def __init__(self):
        self.var3=20
        super().__init__() ## Line 1

c=C()
print(c.var1)

РЕДАКТИРОВАТЬ. Когда я попытался напечатать переменную класса A, используя объект класса B, он отлично работает

class A:
    def __init__(self):
        self.var1=5

class B(A):
    def __init__(self):
        self.var2=10
        super().__init__()

b=B()
print(b.var1)

Мой вопрос: почему c.var1 не выдает правильный вывод? (в обоих случаях super().__init__() и super().super().__init__() и как я могу получить к нему доступ?


person Ash Upadhyay    schedule 28.01.2018    source источник
comment
Разве вы не должны передавать аргумент c = C(<class instance here>) при вызове? Иначе какой смысл ожидать аргумент либо для класса B, либо для класса C?   -  person Tobiah Rex    schedule 28.01.2018
comment
поскольку приведенный выше код имеет непараметризованный конструктор, при вызове конструктора нам не требуется передавать какие-либо аргументы. Теперь точка ожидания аргумента для класса B или класса C заключается в том, что я предполагаю, что, поскольку переменные, объявленные в конструкторах, являются общедоступными, а не частными, поэтому, когда класс наследуется, их переменные экземпляра должны быть доступны. это ты меня спрашиваешь? :)   -  person Ash Upadhyay    schedule 28.01.2018
comment
Более или менее, да, это отвечает на мой вопрос - Интересно. Я новичок в Python, поэтому спасибо за объяснение.   -  person Tobiah Rex    schedule 28.01.2018
comment
Мы все здесь, чтобы учиться друг у друга :) спасибо, что задали замечательный вопрос для дальнейшего объяснения. И да, поскольку я тоже новичок, как и вы, я всегда стараюсь помогать другим разработчикам в построении их репутации. :) Так что еще раз спасибо.   -  person Ash Upadhyay    schedule 28.01.2018


Ответы (1)


Вот небольшой тест для вас, который поможет;

class A:
    def __init__(self):
        self.var1 = 5
        print("In A")

class B(A):
    def __init__(self):
        self.var2 = 10
        print("In B")

class C(B):
    def __init__(self):
        self.var3 = 20
        print("In C")
        super().__init__() ## Line 1

c = C()

будет печатать;

In C
In B

но если вы добавите вызов в B в конструктор A;

class A:
    def __init__(self):
        self.var1 = 5
        print("In A")

class B(A):
    def __init__(self):
        self.var2 = 10
        print("In B")
        super().__init__()

class C(B):
    def __init__(self):
        self.var3 = 20
        print("In C")
        super().__init__() ## Line 1

c = C()

Вы получаете то, что ожидаете;

In C
In B
In A

и это...

print(c.var1)
5
person SteveJ    schedule 28.01.2018
comment
замечательно. Не могли бы вы также помочь мне понять, почему я получаю сообщение об ошибке AttributeError: 'super' object has no attribute 'super' при использовании `super().super().__init__()` - person Ash Upadhyay; 28.01.2018
comment
В качестве пояснения здесь - так же, как функция инициализации C не вызывает автоматически функцию B, B не вызывает функцию инициализации A, если она явно не настроена для этого. - person g.d.d.c; 28.01.2018
comment
@AshUpadhyay - Честно говоря, я никогда не пробовал это таким образом - и я не могу придумать причину, по которой я бы это сделал. - person SteveJ; 28.01.2018
comment
Нет проблем @SteveJ, спасибо за прекрасное объяснение. :) Голосование и принятие вашего ответа. - person Ash Upadhyay; 28.01.2018