Объект обновления Python из словаря

Есть ли встроенная функция / оператор, которую я мог бы использовать для распаковки значений из словаря и присвоения их переменным экземпляра?

Вот что я собираюсь сделать:

c = MyClass()
c.foo = 123
c.bar = 123

# c.foo == 123 and c.bar == 123


d = {'bar': 456}
c.update(d)

# c.foo == 123 and c.bar == 456

Что-то вроде словаря update(), который загружает значения из другого словаря, но для простого экземпляра объекта / класса?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
25
0
23 269
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попытался ли ты

f.__dict__.update( b )

?

python.org/doc/2.5.2/ref/types.html или docs.python.org/reference/…. Раздел под названием «классы» довольно подробно описывает, как именно это работает.
S.Lott 02.01.2009 00:23

Это будет незаметно вести себя неправильно, если атрибут класса не хранится в __dict__ экземпляра. Например, свойства и атрибуты класса. В общем, ответ Иехии безопаснее.

Jon-Eric 09.02.2012 20:19

setattr - наиболее предпочтительный способ пойти сюда. Использование внутреннего объекта .__ dict__ не рекомендуется.

qubird 24.11.2017 17:12

Кроме того, возможно, было бы неплохо иметь оболочку вокруг метода обновления dict:

def update(self, b):
    self.__dict__.update(b)

PS: Извините за то, что не комментирую сообщение @ С.Лотт, но у меня еще нет репутации.

Дубликат ответа С.Лотта.

pppery 03.06.2016 15:53
Ответ принят как подходящий

есть также другой способ сделать это, перебирая элементы в d. у этого нет такого же предположения, что они будут храниться в c.__dict__, что не всегда верно.

d = {'bar': 456}
for key,value in d.items():
    setattr(c,key,value)

или вы можете написать метод update как часть MyClass, чтобы c.update(d) работал так, как вы ожидали.

def update(self,newdata):
    for key,value in newdata.items():
        setattr(self,key,value)

ознакомьтесь с справкой по setattr

setattr(...)
    setattr(object, name, value)
    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ''x.y = v''.

Я уже знаю о setattr ... Не могли бы вы объяснить, почему некоторых элементов нет в диктовать? На самом деле я все еще использовал этот тип loop + setattr, потому что диктовать почему-то был недоступен.

chakrit 03.01.2009 10:39

Конечно, основное различие заключается между атрибутами класса и атрибутами экземпляра. Только последние есть в __dict__. поэтому, если у вас есть класс Test: a = 1 t = Test (), объект t имеет пустой __dict__, потому что a является атрибутом класса t.b = 2, теперь у него есть __dict__ из {'b':2}

Jehiah 08.01.2009 01:51

а где хранятся атрибуты класса? в Test.__dict__ я полагаю? (это было бы хорошо)

n611x007 26.04.2013 19:07

Вы можете попробовать сделать:

def to_object(my_object, my_dict):
    for key, value in my_dict.items():
        attr = getattr(my_object, key)
        if hasattr(attr, '__dict__'):
            to_object(attr, value)
        else:
            setattr(my_object, key, value)

obj = MyObject()
data = {'a': 1, 'b': 2}
to_object(obj, data)

Другие вопросы по теме