Инициализация атрибутов данных - PullRequest
0 голосов
/ 22 марта 2011

У меня есть такой класс

class SomeClass:
    def doSomething(self):
        self.counter = 50

Я создаю экземпляр x для SomeClass

x = SomeClass()

Когда я пытаюсь получить значение счетчика следующим образом: x.counter Я получаю следующую ошибку -

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'counter'

Но после того, как я вызываю функцию-член x.doSomething() и затем ищу атрибут данных, он становится доступным.

>>> x.doSomething()
>>> x.counter
50

Почему это так? Разве все атрибуты данных не будут доступны после создания экземпляра?

Спасибо.

1 Ответ

7 голосов
/ 22 марта 2011

Нет, self.counter создается только тогда, когда вызывается doSomething().В Python атрибуты экземпляра являются динамическими и могут быть созданы во время выполнения.Чтобы иметь self.counter доступный при создании объекта, поместите его инициализацию в конструктор:

class SomeClass:
    def __init__(self):
        self.counter = None
    def doSomething(self):
        self.counter = 50

Теперь все экземпляры SomeClass будут иметь self.counter доступными с начала, хотя его значение будетNone до doSomething.Естественно, существует множество вариантов этой темы, позволяющих вам реализовать именно ту семантику, которая вас интересует.

...