在Python中从字典设置属性

141 投票
8 回答
137457 浏览
提问于 2025-04-15 20:33

在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

这样设置属性几乎肯定不是解决问题的最佳方法。要么:

  1. 你提前知道所有字段应该是什么。在这种情况下,你可以明确地设置所有属性。这样做的代码看起来像

    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 
    

    或者

  2. 你不知道所有字段应该是什么。在这种情况下,你应该把数据存储为一个字典,而不是让对象的命名空间变得混乱。属性是用来静态访问的。这种情况下的代码看起来像

    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)

撰写回答