在Python中从字典设置属性
在Python中,有没有办法从一个字典创建一个对象,让字典里的每个键都变成这个对象的属性呢?
就像这样:
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print e.name # Oscar
print e.age + 10 # 42
我觉得这问题和这个问题正好相反:从对象的字段创建Python字典
8 个回答
22
你可以通过 __dict__
来访问一个对象的属性,然后可以在它上面调用更新方法:
>>> 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.age
32
50
这样设置属性几乎肯定不是解决问题的最佳方法。要么:
你提前知道所有字段应该是什么。在这种情况下,你可以明确地设置所有属性。这样做的代码看起来像
class Employee(object): def __init__(self, name, last_name, age): self.name = name self.last_name = last_name self.age = age d = {'name': 'Oscar', 'last_name': 'Reyes', 'age':32 } e = Employee(**d) print e.name # Oscar print e.age + 10 # 42
或者
你不知道所有字段应该是什么。在这种情况下,你应该把数据存储为一个字典,而不是让对象的命名空间变得混乱。属性是用来静态访问的。这种情况下的代码看起来像
class Employee(object): def __init__(self, data): self.data = data d = {'name': 'Oscar', 'last_name': 'Reyes', 'age':32 } e = Employee(d) print e.data['name'] # Oscar print e.data['age'] + 10 # 42
另一种基本上和第一种情况等价的解决方案是使用 collections.namedtuple
。可以查看van的回答,了解如何实现这个。
216
当然,可以像这样做:
class Employee(object):
def __init__(self, initial_data):
for key in initial_data:
setattr(self, key, initial_data[key])
更新
正如Brent Nash所建议的,你可以通过允许关键字参数来让这个更灵活:
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])
然后你可以这样调用它:
e = Employee({"name": "abc", "age": 32})
或者这样:
e = Employee(name="abc", age=32)
甚至可以这样:
employee_template = {"role": "minion"}
e = Employee(employee_template, name="abc", age=32)