Можно ли создать объект из словаря в Python таким образом, чтобы каждый ключ был атрибутом этого объекта?
Что-то вроде этого:
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print e.name # Oscar
print e.age + 10 # 42
Я думаю, что это было бы в значительной степени обратным этому вопросу: словарь Python из полей объекта
def __init__(self,**initial_data)
вы получаете дополнительное преимущество наличия метода инициализации, который также может выполнять аргументы ключевого слова (например, «e = Employee (name = 'Oscar')» или просто использовать словарь (например, «e = Employee ( ** dict) ").Employee(some_dict)
иEmployee(**some_dict)
API несовместимо. Следует поставить то, что лучше.()
вместо тогоNone
, вы можете сделать это следующим образом:def __init__(self, iterable=(), **kwargs): self.__dict__.update(iterable, **kwargs)
.[[setattr(self,key,d[key]) for key in d] for d in some_dict]
AddressNotFoundError
(чтобы в этом случае возвращать исправленные данные, а не взрывать) - мне показалось безумием, что что-то такое простое в PHP ((object) ['x' => 'y']
) требует так много беспорядка в PythonТакая установка атрибутов почти наверняка не лучший способ решить проблему. Либо:
Вы знаете, какие поля должны быть заранее. В этом случае вы можете явно установить все атрибуты. Это будет выглядеть как
или
Вы не знаете, какие поля должны быть заранее. В этом случае вы должны хранить данные как dict вместо того, чтобы загрязнять пространство имен объектов. Атрибуты предназначены для статического доступа. Этот случай будет выглядеть как
Другое решение, которое в основном эквивалентно случаю 1, - использовать файл
collections.namedtuple
. См. Ответ Ван, чтобы узнать, как это реализовать.источник
Вы можете получить доступ к атрибутам объекта с помощью
__dict__
и вызвать для него метод обновления:источник
__dict__
является артефактом реализации и не должен использоваться. Кроме того, это игнорирует наличие дескрипторов в классе.__dict__
является документированной частью языка, а не артефактом реализации.setattr
предпочтительнее__dict__
прямого доступа . Вы должны помнить о множестве вещей, которые могут привести к__dict__
тому, что вы не будете присутствовать или не будете делать то, что вы хотите, когда вы используете__dict__
, ноsetattr
практически идентичны тому, что вы делаете на самом делеfoo.bar = baz
.__dict__
не рекомендуется использовать в целом : docs.python.org/tutorial/classes.html#id2Почему бы просто не использовать имена атрибутов как ключи к словарю?
Вы можете инициализировать именованные аргументы, список кортежей, словарь или отдельные атрибуты, например:
В качестве альтернативы, вместо того, чтобы вызывать ошибку атрибута, вы можете вернуть None для неизвестных значений. (Уловка, используемая в классе хранилища web2py)
источник
Я думаю, что использование ответа
settattr
- лучший вариант, если вам действительно нужна поддержкаdict
.Но если
Employee
объект - это просто структура, к которой вы можете получить доступ с помощью точечного синтаксиса (.name
) вместо синтаксиса dict (['name']
), вы можете использовать namedtuple следующим образом:У вас есть
_asdict()
способ доступа ко всем свойствам в виде словаря, но вы не можете добавить дополнительные атрибуты позже, только во время построения.источник
скажем например
если вы хотите установить атрибуты сразу
источник
a.__dict__.update(x=100, y=300, z="blah")
аналогично использованию dict, вы можете просто использовать kwargs следующим образом:
источник