Вы не можете получить доступ к self.config_array
до BaseClass.__init__()
побежал, чтобы установить атрибут.
Либо исправить FirstOrderSubClass
, чтобы также вызвать базовый класс __init__
или назвать его напрямую.
Крепление FirstOrderSubClass
, вероятно, лучший способ сделать это:
class FirstOrderSubClass(BaseClass):
def __init__(self, name):
super(FirstOrderSubClass, self).__init__()
self.name = name
Однако ваш __init__
подпись метод не совпадает, так что вы не можете полагаться на кооперативном поведении здесь; как только вы добавите класс смешения в иерархию, все может и, возможно, сломается. См. *Python's super()
is considered super! Раймондом Хеттингером, или его последующее описание PyCon presentation, чтобы объяснить, почему вы хотите, чтобы ваши подписи соответствовали друг другу.
Вызов несвязанного метода BaseClass.__init__
непосредственно (переходящая в self
в явном виде) также будет работать:
class SecondOrderSubClass(FirstOrderSubClass):
def __init__(self, name, version):
super(SecondOrderSubClass, self).__init__(self.name)
self.version = version
BaseClass.__init__(self)
Обратите внимание, что нет никакого смысла в присвоении self.name
там, если вы собираетесь спросить FirstOrderSubClass.__init__
сделать точно такое же вещь.
Правильный способ использования super()
- это для всех ваших методов как минимум принять все те же аргументы. Поскольку object.__init__()
никогда не делает, это означает, что вам нужен класс дозорного, который не использует super()
; BaseClass
здесь будет хорошо. Вы можете использовать *args
и **kw
захватить любые дополнительные аргументы и просто игнорировать те, чтобы сделать совместные подклассы работы:
class BaseClass(object):
def __init__(self, *args, **kw):
with open(config.txt) as f
self.config_array = f.readlines()
class FirstOrderSubClass(BaseClass):
def __init__(self, name, *args, **kw):
super(FirstOrderSubClass, self).__init__(*args, **kw)
self.name = name
class SecondOrderSubClass(FirstOrderSubClass):
def __init__(self, name, version, *args, **kw):
super(SecondOrderSubClass, self).__init__(name, *args, **kw)
self.version = version
Вы уже наследующий атрибут, add 'super (FirstOrderSubClass, self) .__ init __()' в 'FirstOrderSubClass' –