Подтвердить что ты не робот

Добавление атрибутов в объекты python

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

>>> 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!

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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