У меня есть BaseClass и AbstractClass, унаследованный от BaseClass. Это структура, которая у меня есть
class BaseClass(object):
def __init__(self, initialize=True):
self.name = 'base_class'
self.start = 0
if initialize:
self.start = 100
class AbstractClass(BaseClass):
def __init__(self):
self.name = 'asbtract_class'
super(BaseClass, self).__init__()
Я хочу передать абстрактному классу параметр initialize, который передается базовому классу, и если True устанавливает значение start объекта на 100.
Я попытался использовать super(BaseClass, self).__init__(), но абстрактный класс не получил атрибута start. Я получаю сообщение об ошибке, когда пытаюсь получить к нему доступ.
Как я могу передать значение аргумента initialize в AbstractClass и использовать метод BaseClass__init__ для установки атрибута start на AbstractClass.
Код, который я использовал
best = BaseClass()
abs = AbstractClass()
abs.start # AttributeError: 'AbstractClass' object has no attribute 'start'
@Sraw Работает, спасибо!






Чтобы вызвать конструктор суперкласса, вы должны использовать имя класса подкласса, а не суперкласса, то есть:
class AbstractClass(BaseClass):
def __init__(self):
super(AbstractClass, self).__init__()
self.name = 'abstract_class'
Также обратите внимание, что я изменил порядок вызова конструктора суперкласса и установки атрибута name. Если вы установите его перед вызовом суперкласса, атрибут будет переопределен конструктором суперкласса, что, скорее всего, не то, что вы намеревались
И, как указал @Sraw, для python 3 обозначение вызова super больше не требует ссылки на имя класса и может быть упрощено до
class AbstractClass(BaseClass):
def __init__(self):
super().__init__()
Спасибо за это. Теперь я могу получить доступ к параметру start. Но мне также нужно иметь возможность передавать аргумент initialize от AbstractClass . То есть примерно так: abs = AbstractClass(initialize=False). Есть способ сделать это? В настоящее время это вызывает ошибку.
Просто добавьте параметр в AbstractClass.__init__ и передайте его при вызове super().__init__(). Никакой магии здесь нет, это просто обычные скучные вызовы функций ...
@brunodesthuilliers хорошо, теперь он работает. Спасибо
Если вы используете Python3, вы можете упростить его до
super().__init__()