É possível criar um objeto a partir de um dicionário em python de forma que cada chave seja um atributo desse objeto?
Algo assim:
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print e.name # Oscar
print e.age + 10 # 42
Acho que seria exatamente o inverso desta questão: dicionário Python dos campos de um objeto
python
dictionary
properties
attributes
initialization
OscarRyz
fonte
fonte
def __init__(self,**initial_data)
obtém o benefício adicional de ter um método init que também pode fazer argumentos de palavras-chave (por exemplo, "e = Employee (name = 'Oscar')" ou apenas obter um dicionário (por exemplo, "e = Employee ( ** dict) ").Employee(some_dict)
eEmployee(**some_dict)
APIs é inconsistente. O que for melhor deve ser fornecido.()
invés deNone
, você poderia fazê-lo assim: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
(para retornar dados corrigidos nesse caso, em vez de explodir) - achei uma loucura que algo tão fácil em PHP ((object) ['x' => 'y']
) exigisse tanto lixo em PythonDefinir os atributos dessa maneira quase certamente não é a melhor maneira de resolver um problema. Ou:
Você sabe o que todos os campos devem ser antes do tempo. Nesse caso, você pode definir todos os atributos explicitamente. Isso pareceria
ou
Você não sabe o que todos os campos devem estar antes do tempo. Nesse caso, você deve armazenar os dados como um dicionário em vez de poluir o namespace de um objeto. Os atributos são para acesso estático. Este caso pareceria
Outra solução que é basicamente equivalente ao caso 1 é usar a
collections.namedtuple
. Veja a resposta da van para saber como implementar isso.fonte
Você pode acessar os atributos de um objeto com
__dict__
e chamar o método de atualização nele:fonte
__dict__
é um artefato de implementação e não deve ser usado. Além disso, isso ignora a existência de descritores na classe.__dict__
é uma parte documentada da linguagem, não um artefato de implementação.setattr
é preferível a acessar__dict__
diretamente. Você tem que ter em mente muitas coisas que podem__dict__
fazer com que você não esteja lá ou não faça o que você quer ao usar__dict__
, massetattr
é virtualmente idêntico a realmente fazerfoo.bar = baz
.__dict__
é desaconselhado: docs.python.org/tutorial/classes.html#id2Por que não usar nomes de atributos apenas como chaves para um dicionário?
Você pode inicializar com argumentos nomeados, uma lista de tuplas ou um dicionário ou atribuições de atributos individuais, por exemplo:
Como alternativa, em vez de aumentar o erro de atributo, você pode retornar Nenhum para valores desconhecidos. (Um truque usado na classe de armazenamento web2py)
fonte
Acho que usar essa resposta
settattr
é o caminho a percorrer se você realmente precisa de suportedict
.Mas se
Employee
objeto for apenas uma estrutura que você pode acessar com sintaxe de ponto (.name
) em vez de sintaxe de dict (['name']
), você pode usar namedtuple como este:Você tem um
_asdict()
método para acessar todas as propriedades como dicionário, mas não pode adicionar atributos adicionais posteriormente, apenas durante a construção.fonte
diga por exemplo
se você quiser definir os atributos de uma vez
fonte
a.__dict__.update(x=100, y=300, z="blah")
semelhante a usar um dicionário, você pode apenas usar kwargs assim:
fonte