为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 Python 字典键分配给相应的 Python 对象属性

如何将 Python 字典键分配给相应的 Python 对象属性

守着星空守着你 2023-07-11 13:51:58
假设我有一个 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 calluser = get_user_data() # this returns the dictionary like {'name': 'John', 'dob': '1992-07-12'}现在,将数据分配给用户对象的方法是userObj.name = user['name']和userObj.dob = user['dob']。假设,用户有 100 个属性。我必须明确分配这些属性。Python 中有没有一种有效的方法可以用来将字典中的值分配给对象中的相应属性?就像,name字典中的键被分配给name对象中的属性。
查看完整描述

5 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

而不是将字典映射到变量键。您可以使用它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)


查看完整回答
反对 回复 2023-07-11
?
LEATH

TA贡献1936条经验 获得超6个赞

首先,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])


查看完整回答
反对 回复 2023-07-11
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

1.修改类定义

class User():
    def __init__(self, id):
        self.data = {"id":id}
userObj = User(id=12)

2.更新dict()

user = {"name":"Frank", "dob":"Whatever"} # Get the remaining data from elsewhere
userObj.data.update(user) # Update the dict in your userObj
print(userObj.data)

干得好 !


查看完整回答
反对 回复 2023-07-11
?
慕村225694

TA贡献1880条经验 获得超4个赞

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()]


查看完整回答
反对 回复 2023-07-11
?
莫回无

TA贡献1865条经验 获得超7个赞

如果您确实需要

该解决方案适用于这种情况,其他解决方案不适合您,并且您无法更改您的班级。

问题

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

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]])

当然有更好的解决方案,但是如果其他方法不适合您,这可能会派上用场

更新

此解决方案使用基于您使用的类的属性定义。因此,如果字典有缺失值,这个解决方案可能会有所帮助。否则,拉希德解决方案也适合您


查看完整回答
反对 回复 2023-07-11
  • 5 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信