python: динамическое добавление атрибутов во встроенный класс - PullRequest
0 голосов
/ 13 января 2012

Почему он не работает для встроенных классов?

Является ли использование подкласса лучшим подходом для его исправления, или я столкнусь с некоторыми скрытыми проблемами?

a = {}
a.p = 1 # raises AttributeError
class B(dict):
  pass
b = B()
b.p = 1 # works

РЕДАКТИРОВАТЬ: мой первоначальный комментарий, что он не работает для b, был неверным (я сделал ошибку).

Ответы [ 2 ]

4 голосов
/ 13 января 2012

Встроенные классы не имеют возможности иметь произвольные атрибуты. Это делается из соображений производительности, особенно использования памяти, вы хотите, чтобы встроенные классы, такие как list и dict, были как можно меньше, чтобы их было много.

Поэтому встроенные классы не имеют словаря __dict__, необходимого для работы произвольных атрибутов.

Вы можете добиться того же для ваших классов. Если они написаны на C, вы просто не реализуете поддержку __dict__. Если они написаны на Python, вы используете slots .

0 голосов
/ 13 января 2012

Если вы хотите создать подкласс dict, вы всегда можете использовать UserDict ( здесь документация ).

И это работает с тем, что вы пытаетесь сделать:

from collections import UserDict

a = UserDict()
a.p = 10 # works fine
...