Многократное наследование и использование суперфункций в Python - PullRequest
0 голосов
/ 04 ноября 2019
class Test:

    def __init__(self, name, age):
        self.name = name
        self.age = age

class Test1:

    def __init__(self, school, university):
        self.school = school
        self.university = university

    def get(self):
        print('josh')

class Test2(Test,Test1):

    def __init__(self, name1, age1, school1, university1):
        super().__init__(name = name1, age = age1 , school = school1,  university = university1)


t = Test2('john', 16, 'Harvard', 'Yale')

Почему я не могу присвоить значение атрибуту родительского класса? Например, для вышеупомянутых классов, почему я не могу выполнить ниже?

t.school # returns error 
t.university #returns error

Но, следующие действительны?

t.name
t.age

Я бы хотел этого добиться, полагаясь исключительно на суперфункцию.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Я нашел решение - оно просто использует супер функцию для инициализации всех атрибутов (родительского класса).

   class Test:

        def __init__(self, name, age, **kwargs):
            self.name = name
            self.age = age
            super().__init__(**kwargs)

    class Test1:

        def __init__(self, school, university, **kwargs):
            self.school = school
            self.university = university
            super().__init__(**kwargs)

        def get(self):
            print('josh')

    class Test2(Test,Test1):

        def __init__(self, name1, age1, school1, university1, **kwargs):
            kwargs['name'] = name1
            kwargs['age'] = age1
            kwargs['school'] = school1
            kwargs['university'] = university1
            super().__init__(**kwargs)

    t = Test2('john', 16, 'Harvard', 'Yale')
    print(t.name)
    print(t.age)
    print(t.school)
    print(t.university)
0 голосов
/ 04 ноября 2019

Вы должны вызвать конструктор для каждого из базовых классов. См. Здесь:

class Test:

    def __init__(self, name, age):
        self.name = name
        self.age = age

class Test1:

    def __init__(self, school, university):
        self.school = school
        self.university = university

    def get(self):
        print('josh')

class Test2(Test,Test1):

    def __init__(self, name1, age1, school1, university1):
        Test.__init__(self, name1, age1)
        Test1.__init__(self, school1, university1)


t = Test2('john', 16, 'Harvard', 'Yale')
print(t.name)
print(t.age)
print(t.school)
print(t.university)
...