Чи змінюється __dict__ об'єкта для встановлення його властивостей вважається пітонічним?


12

У мене є клас, який надуває об'єкти з рядків, знайдених у базі даних (або іншого джерела, наприклад, MongoDB, CSV-файл тощо). Для встановлення властивостей об'єкта він робить щось на зразок self.__dict__.update(**properties)або obj.__dict__.update(**properties).

Це вважається пітонічним? Це хороша модель, яку я повинен продовжувати використовувати, чи це вважається поганою формою?


1
Я не знаю, чи це Pythonic, але це, звичайно, частіше це робити в innder init.
user16764

Відповіді:


10

У Python 3.3 був доданий новий тип types.SimpleNamespace(), і в документації він описаний таким чином:

Тип приблизно еквівалентний наступному коду:

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

Зверніть увагу на __init__метод типу; ви не можете отримати кращу підтримку методики, ніж документація Python.


Хоча SimpleNamespaceсильно відрізняється від більшості типів тим, що не має фіксованого набору атрибутів.

7
Ну, кажучи про документацію Python, від docs.python.org/2/library/stdtypes.html "Особливим атрибутом кожного модуля є __dict__цей словник, що містить таблицю символів модуля. Змінення цього словника фактично змінить символ модуля. таблиця, але пряме призначення __dict__атрибуту неможливо (ви можете написати m.__dict__['a'] = 1, що визначає m.aяк 1, але ви не можете writem.__dict__ = {}). Змінити __dict__безпосередньо не рекомендується ", що саме спочатку спонукало мене задати це питання.
skyler

@skyler: зауважте, що це згадує лише простір імен модуля . globals()Функція повертає той же простір імен, і, як правило , більш ефективні способи вирішення проблем , ніж установка глобальний динамічно, тому попередження.
Martijn Pieters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.