Почему пользовательские типы принимают ad-hoc-атрибуты в Python (а встроенные - нет)?

Я хотел бы знать, почему можно создать новый атрибут ( "new" означает "ранее не определено в теле тела" ) для экземпляра пользовательского типа, но не может сделать то же самое для встроенный тип, например object.

Пример кода:

>>> class SomeClass(object):
...     pass
... 
>>> sc = SomeClass()
>>> sc.name = "AAA"
>>> sc.name
'AAA'
>>> obj = object()
>>> obj.name = "BBB"
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'object' object has no attribute 'name'

Ответ 1

Некоторые объекты не имеют атрибута __dict__ (который является словарем, в котором хранятся все пользовательские "новые определенные атрибуты" ). Вы можете эмулировать одно и то же поведение с помощью переменной __slots__ (см. ссылка на python). Когда вы подклассифицируете класс с __dict__, переменная __slots__ не имеет никакого эффекта. И поскольку вы всегда подклассифицируете объект для новых классов стилей, объект не должен иметь __dict__, так как это делает невозможным использование __slots__. Классы без __slots__ занимают меньше памяти и, вероятно, немного быстрее.