鱼C论坛

 找回密码
 立即注册
查看: 2244|回复: 9

[已解决]如何将字典的键和值转为一个类中属性的名字和值

[复制链接]
发表于 2020-9-12 15:28:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 FC的注册很坑 于 2020-9-12 15:28 编辑

举个例子,已知字典
dict={"a":1,"b":2}

然后定义一个类,希望它的属性值是这个字典的key和value,例如:
class A:
    def __init__(self):
        self.a=1
        self.b=2

上面是明确知道字典有哪些key,手动定义方法中属性的情况。

但是如果我不知道字典里有什么,只是确定字典格式key都是字符串,这个类的初始输入参数就是这个字典,并且需要把所有key都转为这个类的属性,类似:
class A:
    def __init__(self,dict):
        for key,value in self.dict.items(): #这句可以得到key,value,但是怎么转成类属性呢?并且key是事先不确定的,即dict里可能不止有a,b,还有其他未知的key也都要变成“self.key=value”

这么做的目的是,变量a,b等会在该类的其他方法中反复出现,并且我想用属性而不是重复用dict['a']来得到值。
最佳答案
2020-9-12 15:41:26
本帖最后由 sunrise085 于 2020-9-12 15:42 编辑
dict1={"a":1,"b":2}
class A:
    def __init__(self,dict1):
        for key,value in dict1.items():
            self.__dict__[key]=value

abc=A(dict1)
print(abc.a,abc.b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-12 15:41:20 | 显示全部楼层
>>> class A:
        pass

>>> dict1 = {"a": 1, "b": 2, "c": 3}
>>> for key, value in dict1.items():
        exec(f"A.{key} = {value}")

        
>>> A.a
1
>>> A.b
2
>>> A.c
3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 15:41:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-9-12 15:42 编辑
dict1={"a":1,"b":2}
class A:
    def __init__(self,dict1):
        for key,value in dict1.items():
            self.__dict__[key]=value

abc=A(dict1)
print(abc.a,abc.b)

评分

参与人数 1鱼币 +1 收起 理由
FC的注册很坑 + 1 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-12 16:37:39 | 显示全部楼层
self.__dict__.update
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 17:01:38 From FishC Mobile | 显示全部楼层
第三种方法,使用魔法方法:
adict={"a":1,"b":2}

class A:
    def __init__(self, anydict):
        for k, v in anydict.items():
            super().__setattr__(k, v)

acl = A(adict)

print(acl.a)
print(acl.b)

评分

参与人数 1鱼币 +1 收起 理由
FC的注册很坑 + 1 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 17:09:45 | 显示全部楼层
setattr(obj, key, value)   内置方法  

评分

参与人数 1鱼币 +1 收起 理由
FC的注册很坑 + 1 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 17:37:08 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2020-9-12 23:46 编辑
Stubborn 发表于 2020-9-12 17:09
setattr(obj, key, value)   内置方法


大佬的意思是这样的
adict={"a":1,"b":2}

class A:
    def __init__(self, anydict):
        for k, v in anydict.items():
            setattr(self, k, v)

acl = A(adict)

print(acl.a)
print(acl.b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 23:27:59 | 显示全部楼层
hrp 发表于 2020-9-12 17:37
大佬的意思是这样的

在类里面,不要写A,换成self
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 23:45:48 | 显示全部楼层
Stubborn 发表于 2020-9-12 23:27
在类里面,不要写A,换成self

get √
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-13 13:30:21 | 显示全部楼层
本帖最后由 FC的注册很坑 于 2020-9-13 13:45 编辑


因为value可能是任何类型的数据,如果value是字符串,这种方法好像还有点问题。。。
例如下面的代码
class A:
    pass
dict1 = {"a": 1, "b": "2", "c": 3}
for key, value in dict1.items():
        exec(f"A.{key} = {value}")


print(A.a)
print(A.b)
print(type(A.a))
print(type(A.b))
结果是:
1
2
<class 'int'>
<class 'int'>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 17:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表