Перво-наперво, я довольно новичок в python, но я много работал и делал много уроков и примеров проектов, чтобы стать лучше, поэтому, если я упускаю что-то очевидное, я извиняюсь.

Некоторое время я пытался это выяснить, и я провел несколько поисков здесь и через Google, но я не могу понять, как превратить найденные мной примеры в то, что я ' Я искал, поэтому я надеялся, что кто-то здесь может дать мне толчок в правильном направлении.

class Super1:
    def __init__(self,artib1,atrib2,atrib3):
        self.atrib1 = atrib1
        self.atrib2 = atrib2
        self.atrib3 = atrib3

class Sub1(Super1):
    def __init__(self,atrib4,atrib5,atrib6)
        self.atrib4 = atrib4
        self.atrib5 = atrib5
        self.atrib6 = atrib6

Хорошо, так что я не могу понять, что в уроках, которые я сделал, они сказали, что я могу позвонить в класс следующим образом:

spam = Super1("eggs","foo","bar")

И если я введу

print spam.atrib1

Это выплюнуло бы

eggs

Что я хочу сделать, так это сделать spam = Sub1, но я не знаю, как его назвать, чтобы я мог установить все атрибуты, как я делал с Super1.

Я просмотрел несколько примеров «множественного наследования», но, похоже, не могу примирить примеры с моими собственными потребностями. Большинство учебных пособий не имеют более 1 атрибута или часто имеют подпрограмму «переопределить» атрибуты супер.

Я также зарегистрировался в композиции, и я не уверен, что это именно то, что я ищу для этой части моего проекта, но я знаю, что она понадобится мне в следующих частях.

Если кто-нибудь может указать мне правильное направление, это было бы здорово.

0
Ward Seabrook 30 Авг 2017 в 20:01

4 ответа

Лучший ответ
  1. Вам нужно вызвать конструктор родительского класса Super1.__init__(self)
  2. Вам также нужно разрешить Sub1 принимать аргументы для конструктора родительского класса.

С изменениями выше, ваш код становится:

class Sub1(Super1):
    def __init__(self, artib1, atrib2, atrib3, atrib4, atrib5, atrib6)
        Super1.__init__(self, artib1, atrib2, atrib3)
        self.atrib4 = atrib4
        self.atrib5 = atrib5
        self.atrib6 = atrib6

Однако вместо того, чтобы вызывать конструктор родительского класса самостоятельно, вы должны использовать встроенную функцию super:

super(Sub1, self).__init__(artib1, atrib2, atrib3)

Таким образом, вам не нужно жестко кодировать имя родительского класса в каждом конструкторе подклассов. Это позволяет вам легко рефакторинг вашего кода. Еще одним дополнительным преимуществом использования super является то, что он автоматически решает проблемы с множественным наследованием, такие как " наследование алмазов ".

Еще один совет: если вы заранее не знаете количество позиционных аргументов, которое примет суперкласс, вы можете использовать синтаксис *args:

class Sub1(Super1):
        def __init__(self, atrib4, atrib5, atrib6, *args)
            super(Sub1, self).__init__(*args)
            self.atrib4 = atrib4
            self.atrib5 = atrib5
            self.atrib6 = atrib6
3
Christian Dean 30 Авг 2017 в 17:21

Если вы позвоните spam = Super1("eggs","foo","bar"). Это вызовет Super конструктор класса.

0
Dharmesh 30 Авг 2017 в 17:05

Проблема в том, что если вы хотите создать экземпляр для Sub1, вам следует spam = Super1("eggs","foo","bar",atrib4,atrib5,atri6). Также вы должны изменить конструктор для Sub1 следующим образом:

def __init__(self,atrib1,atrib2,atrib3,atrib4,atrib5,atrib6):
     Super1.__init__(self,atrib1,atrib2,atrib3)
     self.atrib4 = atrib4
     self.atrib5 = atrib5
     self.atrib6 = atrib6`
0
Christian Dean 30 Авг 2017 в 17:10

Если Sub1 наследуется от Super1, это должно означать, что является Super1 (с добавлением некоторого дополнительного материала или с некоторыми настройками). Но вы не можете удалить вещи, поэтому Sub1 должен

  1. содержать все, что Super1 содержит
  2. инициализируйте Super1 часть себя, вызывая super(Sub1,self).1.__init__(self, ...) в своем собственном конструкторе.

Итак, если у вас в вашем суперклассе есть член a, значение которого передается его конструктору, ваш подкласс также имеет (наследует) член a и должен каким-то образом передать его значение для конструктора суперкласса.

Значит ли это

class Sub1(Super1):
    def __init__(self, a, b, c, d, e, f):
        super(Sub1, self).__init__(a,b,c)
        self.d=d
        self.e=e
        self.f=f

Или есть какая-то связь между аргументами суперкласса и подкласса (или жестко кодирует подкласс некоторые аргументы суперкласса, или ...), зависит от вашего кода.

1
Useless 30 Авг 2017 в 17:11