Почему пользовательские типы принимают специальные атрибуты в Python (а встроенные - нет)? - PullRequest
10 голосов
/ 30 июля 2010

Я хотел бы знать, почему можно создать новый атрибут («новый» означает «ранее не определенный в теле класса») для экземпляра пользовательского типа, но не может сделать то же самоевстроенный тип, например 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 Ответ

6 голосов
/ 30 июля 2010

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

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