¿Es posible crear un objeto a partir de un diccionario en Python de tal manera que cada clave sea un atributo de ese objeto?
Algo como esto:
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print e.name # Oscar
print e.age + 10 # 42
Creo que sería prácticamente lo contrario de esta pregunta: diccionario de Python de los campos de un objeto
python
dictionary
properties
attributes
initialization
OscarRyz
fuente
fuente
def __init__(self,**initial_data)
, obtiene el beneficio adicional de tener un método de inicio que también puede utilizar argumentos de palabras clave (por ejemplo, "e = Empleado (nombre = 'Oscar')" o simplemente tomar un diccionario (por ejemplo, "e = Empleado ( ** dict) ").Employee(some_dict)
como laEmployee(**some_dict)
API no es coherente. Se debe suministrar el que sea mejor.()
lugar deNone
, usted podría hacerlo de esta manera: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 devolver datos corregidos en ese caso, en lugar de explotar) - Me pareció una locura que algo tan fácil en PHP ((object) ['x' => 'y']
) requiriera tanto cruft en PythonDefinir atributos de esta manera casi con seguridad no es la mejor manera de resolver un problema. Ya sea:
Sabes cuáles deberían ser todos los campos de antemano. En ese caso, puede establecer todos los atributos explícitamente. Esto se vería como
o
No sabe cuáles deberían ser todos los campos antes de tiempo. En este caso, debe almacenar los datos como un dictado en lugar de contaminar un espacio de nombres de objetos. Los atributos son para acceso estático. Este caso se vería así
Otra solución que es básicamente equivalente al caso 1 es usar un
collections.namedtuple
. Vea la respuesta de van sobre cómo implementar eso.fuente
Puede acceder a los atributos de un objeto con
__dict__
y llamar al método de actualización en él:fuente
__dict__
es un artefacto de implementación y no debe utilizarse. Además, esto ignora la existencia de descriptores en la clase.__dict__
es una parte documentada del lenguaje, no un artefacto de implementación.setattr
es preferible acceder__dict__
directamente. Tienes que tener en cuenta muchas cosas que podrían llevar a__dict__
no estar ahí o no hacer lo que quieres cuando lo uses__dict__
, perosetattr
es prácticamente idéntico a hacerlo realmentefoo.bar = baz
.__dict__
se desaconseja el uso general de : docs.python.org/tutorial/classes.html#id2¿Por qué no usar nombres de atributos como claves para un diccionario?
Puede inicializar con argumentos con nombre, una lista de tuplas o un diccionario, o asignaciones de atributos individuales, por ejemplo:
Alternativamente, en lugar de generar el error de atributo, puede devolver Ninguno para valores desconocidos. (Un truco utilizado en la clase de almacenamiento web2py)
fuente
Creo que el uso de respuestas
settattr
es el camino a seguir si realmente necesitas apoyodict
.Pero si el
Employee
objeto es solo una estructura a la que puede acceder con la sintaxis de puntos (.name
) en lugar de la sintaxis dict (['name']
), puede usar namedtuple así:Tiene un
_asdict()
método para acceder a todas las propiedades como diccionario, pero no puede agregar atributos adicionales más adelante, solo durante la construcción.fuente
decir por ejemplo
si desea establecer los atributos a la vez
fuente
a.__dict__.update(x=100, y=300, z="blah")
similar a usar un dict, podría usar kwargs así:
fuente