FC的注册很坑 发表于 2020-9-12 15:28:12

如何将字典的键和值转为一个类中属性的名字和值

本帖最后由 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']来得到值。

qiuyouzhi 发表于 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

sunrise085 发表于 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__=value

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

kogawananari 发表于 2020-9-12 16:37:39

self.__dict__.update

hrp 发表于 2020-9-12 17:01:38

第三种方法,使用魔法方法:
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)

Stubborn 发表于 2020-9-12 17:09:45

setattr(obj, key, value)   内置方法

hrp 发表于 2020-9-12 17:37:08

本帖最后由 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)

Stubborn 发表于 2020-9-12 23:27:59

hrp 发表于 2020-9-12 17:37
大佬的意思是这样的

在类里面,不要写A,换成self

hrp 发表于 2020-9-12 23:45:48

Stubborn 发表于 2020-9-12 23:27
在类里面,不要写A,换成self

get √

FC的注册很坑 发表于 2020-9-13 13:30:21

本帖最后由 FC的注册很坑 于 2020-9-13 13:45 编辑

qiuyouzhi 发表于 2020-9-12 15:41


因为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'>
页: [1]
查看完整版本: 如何将字典的键和值转为一个类中属性的名字和值