Python: «супер» объект не имеет атрибута «attribute_name» - PullRequest
12 голосов
/ 20 мая 2011

Я пытаюсь получить доступ к переменной из базового класса.Вот родительский класс:

class Parent(object):
    def __init__(self, value):
        self.some_var = value

А вот дочерний класс:

class Child(Parent):
    def __init__(self, value):
        super(Child, self).__init__(value)

    def doSomething(self):
        parent_var = super(Child, self).some_var

Теперь, если я попытаюсь запустить этот код:

obj = Child(123)
obj.doSomething()

Я получуследующее исключение:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    obj.doSomething()
  File "test.py", line 10, in doSomething
    parent_var = super(Child, self).some_var
AttributeError: 'super' object has no attribute 'some_var'

Что я делаю не так?Каков рекомендуемый способ доступа к переменным из базового класса в Python?

Ответы [ 2 ]

20 голосов
/ 20 мая 2011

После выполнения базовым классом __init__ производному объекту устанавливаются атрибуты (например, some_var), поскольку это тот же объект, что и self в производном классе '__init__. Вы можете и должны просто использовать self.some_var везде. super предназначен для доступа к вещам из базовых классов, но переменные экземпляра (как следует из названия) являются частью экземпляра, а не частью класса этого экземпляра.

5 голосов
/ 20 мая 2011

Атрибут some_var не существует в родительском классе.

Когда вы задали его во время __init__, он был создан в экземпляре вашего дочернего класса.

...