0

假设我有一个 python 类,如:

class User:
    name = None
    id = None
    dob = None
    
    def __init__(self, id):
        self.id = id

现在我正在做这样的事情:

userObj = User(id=12) # suppose I don't have values for name and dob yet
## some code here and this code gives me name and dob data in dictionary, suppose a function call
user = get_user_data() # this returns the dictionary like {'name': 'John', 'dob': '1992-07-12'}

现在,将数据分配给用户对象的方法是userObj.name = user['name']and userObj.dob = user['dob']。假设,用户有 100 个属性。我将不得不明确分配这些属性。Python中是否有一种有效的方法可以用来将字典中的值分配给对象中的相应属性?就像,name字典中的键被分配给name对象中的属性。

4

5 回答 5

1

首先,不需要在 python 中预先声明属性。

class Foo:
   bar: int # This actually creates a class member, not an instance member
   ...

如果要向类实例添加值,只需使用setattr()

d = {
  'prop1': 'value1',
  'prop2': 'value2',
  'prop2': 'value2'
}

x = Foo()

for prop in d.keys():
  setattr(x, prop, d[prop])
于 2020-09-02T13:16:53.457 回答
1

1.修改Class定义

类用户():
    def __init__(self, id):
        self.data = {"id":id}
userObj = 用户(id=12)

2.更新dict()

user = {"name":"Frank", "dob":"Whatever"} # 从别处获取剩余数据
userObj.data.update(user) # 更新你的 userObj 中的字典
打印(userObj.data)
干得好 !
于 2020-09-02T13:21:03.107 回答
1

而不是将字典映射到变量键。您可以使用setattr在对象中设置变量。

class User:
    name = None
    id = None
    dob = None

    def __init__(self, id):
        self.id = id

    def map_dict(self, user_info):
        for k, v in user_info.items():
            setattr(self, k, v)

然后让锅炉代码使用它。


userObj = User(id=12)
user_dict = {
    'name': 'Bob',
    'dob': '11-20-1993',
    'something': 'blah'
}

userObj.map_dict(user_dict)
于 2020-09-02T13:22:05.987 回答
0
class User(dict):
    def __init__(self, *args, **kwargs):
        super(User, self).__init__(*args, **kwargs)
        self.__dict__ = self

然后拿起你的字典然后做:

userObj  = User(dictionary)

编辑:setattr()然后使用该功能

[setattr(userObj, key, item) for key,item in dict.items()]
于 2020-09-02T13:12:47.807 回答
0

万一你真的需要

此解决方案适用于这种情况,其他解决方案不适用于您,您无法更改课程。

问题

如果你不能以任何方式修改你的类并且你有一个字典,其中包含你想要放入你的对象的信息,你可以首先使用检查模块获取你的类的自定义成员:

import inspect
import numpy as np
members = inspect.getmembers(User)

通过以下方式从所有成员中提取您的自定义属性:

allowed = ["__" not in a[0] for a in members]

并对提取本身使用 numpy 列表理解:

members = np.array(members)["__" not in a[0] for a in members]

修改用户

因此,假设您有以下用户和字典,并且您想将用户属性更改为字典中的值(创建新用户的行为是相同的)

user = User(1)
dic = {"name":"test", "id": 2, "dob" : "any"}

然后你只需使用setattr()

for m in members:
setattr(user, m[0], dic[m[0]])

当然有更好的解决方案,但这可能会派上用场,以防其他事情不适合你

更新

此解决方案根据您使用的类使用属性定义。因此,如果字典缺少值,此解决方案可能会有所帮助。Else Rashids 解决方案也适用于您

于 2020-09-02T13:27:48.020 回答