2014-11-21 5 views
2

Когда я применяю два символа подчеркивания, я получаю ошибку AttributeError: 'Organization' object has no attribute '__employees' Вот код.Ошибка объекта атрибута Python не имеет атрибута

class Organization(object): 
     __employees=[] 

    google=Organization() 
    google.__employees.append('Erik') 

Python не реализует концепцию частной переменной. Если так, то я получаю ошибку. Если я удалю один код подчеркивания, выполните без ошибок.

+2

http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a-double-underscore-before-an-object-name-in-python – IanAuld

ответ

2

Ну, вы указали его как частную переменную.

>>> class Organization(object): 
...  __employees = [] 
... 
>>> google = Organization() 
>>> google._Organization__employees.append('Erik') 
>>> google._Organization__employees 
['Erik'] 

>>> dir(Organization) 
['_Organization__employees', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

Как вы можете видеть, что это сохранить vairable имя с _Classname__Variablename. В вашем случае это _Organization__employees.

Из Python doc с:

Любой идентификатор вида __spam (по крайней мере, два ведущих подчеркивания, не более одной задней подчеркиванием) текстуально заменен _classname__spam, где имя_класса это имя текущего класса с подчеркивание подчеркивания. Это манипулирование выполняется безотносительно к синтаксическому положению идентификатора, поэтому его можно использовать для определить переменные класса, методы, переменные класса-класса, хранящиеся в глобальных переменных, и даже переменные, хранящиеся в экземплярах. private - этот класс для экземпляров других классов.

Смежные вопросы