У меня есть класс, который раздувает объекты из строк, найденных в базе данных (или в другом источнике, например, MongoDB, CSV-файл и т. Д.). Чтобы установить свойства объекта, он делает что-то вроде self.__dict__.update(**properties)
или obj.__dict__.update(**properties)
.
Это считается Pythonic? Это хороший шаблон, который я должен продолжать использовать, или это считается плохой формой?
Ответы:
В Python 3.3 был добавлен новый тип,
types.SimpleNamespace()
и в документации он описан так:Обратите внимание на
__init__
метод типа; Вы не можете получить лучшую поддержку техники, чем документация Python.источник
SimpleNamespace
он отличается от большинства типов тем, что не имеет фиксированного набора атрибутов.__dict__
это словарь, содержащий таблицу символов модуля. Изменение этого словаря фактически изменит символ модуля таблица, но прямое присвоение__dict__
атрибуту невозможно (вы можете написатьm.__dict__['a'] = 1
, что определяетm.a
1, но вы не можетеwritem.__dict__ = {}
). Прямое изменение__dict__
не рекомендуется ", - именно это изначально побудило меня задать этот вопрос.globals()
Функция возвращает то же пространство имен, и, как правило , более эффективные способы решения проблем , чем установка глобалам динамически, поэтому предупреждение.