Set attributes from dictionary in python Set attributes from dictionary in python python python

Set attributes from dictionary in python


Sure, something like this:

class Employee(object):    def __init__(self, initial_data):        for key in initial_data:            setattr(self, key, initial_data[key])

Update

As Brent Nash suggests, you can make this more flexible by allowing keyword arguments as well:

class Employee(object):    def __init__(self, *initial_data, **kwargs):        for dictionary in initial_data:            for key in dictionary:                setattr(self, key, dictionary[key])        for key in kwargs:            setattr(self, key, kwargs[key])

Then you can call it like this:

e = Employee({"name": "abc", "age": 32})

or like this:

e = Employee(name="abc", age=32)

or even like this:

employee_template = {"role": "minion"}e = Employee(employee_template, name="abc", age=32)


Setting attributes in this way is almost certainly not the best way to solve a problem. Either:

  1. You know what all the fields should be ahead of time. In that case, you can set all the attributes explicitly. This would look like

    class Employee(object):    def __init__(self, name, last_name, age):        self.name = name        self.last_name = last_name        self.age = aged = {'name': 'Oscar', 'last_name': 'Reyes', 'age':32 }e = Employee(**d) print e.name # Oscar print e.age + 10 # 42 

    or

  2. You don't know what all the fields should be ahead of time. In this case, you should store the data as a dict instead of polluting an objects namespace. Attributes are for static access. This case would look like

    class Employee(object):    def __init__(self, data):        self.data = datad = {'name': 'Oscar', 'last_name': 'Reyes', 'age':32 }e = Employee(d) print e.data['name'] # Oscar print e.data['age'] + 10 # 42 

Another solution that is basically equivalent to case 1 is to use a collections.namedtuple. See van's answer for how to implement that.


You can access the attributes of an object with __dict__, and call the update method on it:

>>> class Employee(object):...     def __init__(self, _dict):...         self.__dict__.update(_dict)... >>> dict = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }>>> e = Employee(dict)>>> e.name'Oscar'>>> e.age32