2012-05-30 1 views
2

Мне просто интересно, почему переменная, определяемая __init__, недоступна из класса? Должен ли он выполняться во время создания экземпляра, чтобы его доступный извне?переменная область __init__

>>> class a: 
...  data = {} 
... 
>>> a.data 
{} 
>>> class a: 
...  def __init__(self): 
...    self.data = {} 
... 
>>> a.data 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: class a has no attribute 'data' 
+2

Каков цвет концепции шаров вообще? –

+1

Чтобы уменьшить путаницу, вы всегда должны указывать имена классов в верхнем регистре (CamelCase) по [PEP 8] (http://www.python.org/dev/peps/pep-0008/). Здесь вы видите, что 'A' - это только сам класс; '__init__' вызывается во время' a = A() ', после чего' a.data' фактически существует, как противоположность 'A.data'. – glglgl

ответ

12

Переменные, определенные в __init__ являются экземпляра переменные, по определению они не могут быть доступны из области видимости класса. Вот почему это работает:

a().data # data is a member of an instance of class `a` 

... В то время как это не будет работать:

a.data # data is not a member of the `a` class 

Обратите внимание, что __init__ (инициализатор) запускается при создании нового экземпляра a по телефону a(), из этой точки по всем переменным, определенным в __init__, привязаны к этому конкретному экземпляру a.

+1

простой ответ, но объясняет громко и ясно. Благодаря! – asofyan

1

Класс - это проект для объектов. Метод __init__ работает на каждом объекте, чтобы настроить его содержимое. Вы сделали __init__, в котором говорится, что «каждый a объект должен начинаться с атрибута data».

Теперь вы хотите получить доступ к data через класс a.

Какой объектdata вы ожидаете получить? И почему? data не является частью самого класса. Сам класс a отличается от любого заданного объекта a, так же, как шар отличается от концепции шаров . Мяч может быть синим. Понятие шаров не может.