Ответ 1
Вы можете добавлять атрибуты к любому объекту с __dict__
.
-
x = object()
не имеет его, например. - Строки и другие простые встроенные объекты также не имеют этого.
- Классы, использующие
__slots__
, также не имеют его. - Классы, определенные с помощью
class
, имеют его, если не применяется предыдущая инструкция.
Если объект использует __slots__
/не имеет __dict__
, он обычно сохраняет пробел. Например, в str
было бы излишним иметь dict - представьте себе количество наворотов для очень короткой строки.
Если вы хотите проверить, имеет ли данный объект __dict__
, вы можете использовать hasattr(obj, '__dict__')
.
Это также может быть интересно прочитать:
Некоторые объекты, такие как встроенные типы и их экземпляры (списки, кортежи и т.д.), не имеют
__dict__
. Следовательно, пользовательские атрибуты не могут быть установлены на них.
Еще одна интересная статья о модели данных Python, включая __dict__
, __slots__
и т.д., это this из ссылки на python.