Есть ли встроенная функция / оператор, которую я мог бы использовать для распаковки значений из словаря и присвоения их переменным экземпляра?
Вот что я собираюсь сделать:
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(), который загружает значения из другого словаря, но для простого экземпляра объекта / класса?






Попытался ли ты
f.__dict__.update( b )
?
Это будет незаметно вести себя неправильно, если атрибут класса не хранится в __dict__ экземпляра. Например, свойства и атрибуты класса. В общем, ответ Иехии безопаснее.
setattr - наиболее предпочтительный способ пойти сюда. Использование внутреннего объекта .__ dict__ не рекомендуется.
Кроме того, возможно, было бы неплохо иметь оболочку вокруг метода обновления dict:
def update(self, b):
self.__dict__.update(b)
PS: Извините за то, что не комментирую сообщение @ С.Лотт, но у меня еще нет репутации.
Дубликат ответа С.Лотта.
есть также другой способ сделать это, перебирая элементы в 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, потому что диктовать почему-то был недоступен.
Конечно, основное различие заключается между атрибутами класса и атрибутами экземпляра. Только последние есть в __dict__. поэтому, если у вас есть класс Test: a = 1 t = Test (), объект t имеет пустой __dict__, потому что a является атрибутом класса t.b = 2, теперь у него есть __dict__ из {'b':2}
а где хранятся атрибуты класса? в Test.__dict__ я полагаю? (это было бы хорошо)
Вы можете попробовать сделать:
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)