Я хотел бы знать, почему каждый может создать новый атрибут ("новый", означает "не ранее определенный в теле класса") для экземпляра пользовательского типа, но не может сделать то же для встроенного типа, как 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'
Некоторые объекты не имеют атрибута __dict__ (который является словарем, хранящим все пользовательские "вновь определенные" атрибуты). Вы можете эмулировать такое же поведение, используя переменную __slots__ (см. python reference). Когда вы подклассифицируете класс с помощью __dict__, переменная __slots__ не имеет никакого эффекта. А поскольку вы всегда подклассируете object для новых классов стиля, object не должен иметь __dict__, поскольку это сделает невозможным использование __slots__. Классы без __slots__ занимают меньше памяти и, вероятно, немного быстрее.