Добавление атрибутов в объекты Python - PullRequest
35 голосов
/ 06 мая 2011

Это что-то, что беспокоило меня некоторое время. Почему я не могу сделать:

>>> a = ""
>>> a.foo = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'foo'

... а я могу сделать следующее?

>>> class Bar():
...     pass
... 
>>> a = Bar()
>>> a.foo = 10 #ok!

Какое правило здесь? Не могли бы вы указать мне какое-нибудь описание?

1 Ответ

53 голосов
/ 06 мая 2011

Вы можете добавить атрибуты к любому объекту, который имеет __dict__.

  • x = object() не имеет его.
  • Строки и другие простые встроенные объекты также не имеют его.
  • Классы, использующие __slots__, также не имеют его.
  • Классы, определенные с class, имеют его, если не применяется предыдущий оператор.

Если объект использует __slots__ / не имеет __dict__, обычно это экономит место. Например, в str было бы излишне иметь диктат - представьте, как много раздувается для очень короткой строки.

Если вы хотите проверить, имеет ли данный объект __dict__, вы можете использовать hasattr(obj, '__dict__').

Это также может быть интересно прочитать:

Некоторые объекты, такие как встроенные типы и их экземпляры (списки, кортежи и т. Д.), Не имеют __dict__. Следовательно, пользовательские атрибуты не могут быть установлены на них.

Еще одна интересная статья о модели данных Python, включая __dict__, __slots__ и т. Д., это из ссылки на Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...