Перво-наперво, я довольно новичок в 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 атрибута или часто имеют подпрограмму «переопределить» атрибуты супер.
Я также зарегистрировался в композиции, и я не уверен, что это именно то, что я ищу для этой части моего проекта, но я знаю, что она понадобится мне в следующих частях.
Если бы кто-нибудь мог указать мне правильное направление, это было бы здорово.
4 ответа
- Вам нужно вызвать конструктор родительского класса
Super1.__init__(self)
- Вам также нужно разрешить
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
Если вы позвоните spam = Super1("eggs","foo","bar")
. Это вызовет Super
конструктор класса.
Проблема в том, что если вы хотите создать экземпляр для 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`
Если Sub1
наследуется от Super1
, это должно означать, что является Super1 (с добавлением некоторого дополнительного материала или с некоторыми настройками). Но вы не можете удалить вещи, поэтому Sub1
должен
- содержать все, что
Super1
содержит - инициализируйте
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
Или есть какая-то связь между аргументами суперкласса и подкласса (или жестко кодирует подкласс некоторые аргументы суперкласса, или ...), зависит от вашего кода.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.