运维开发网

如何使用Python将字典转换成成员变量

运维开发网 https://www.qedev.com 2022-04-26 14:49 出处:网络
当我们在Python中写一个class时,如果有一部分的成员变量需要用一个字典来命名和赋值,此时应该如何操作呢?这篇文章主要给大家介绍了关于如何利用Python将字典转为成员变量的相关资料,需要的朋友

当我们在Python中写一个class时,如果有一部分的成员变量需要用一个字典来命名和赋值,此时应该如何操作呢?这篇文章主要给大家介绍了关于如何利用Python将字典转为成员变量的相关资料,需要的朋友


技术背景

当我们用Python写一个类的时候,如果有些成员变量需要用字典来命名和赋值,该怎么办?这种情况在从文件(如json、npz等)中读取字典变量时最为常见。)放入内存,然后将它们赋给类的成员变量或生成的实例变量。


使用__dict__定义成员变量

python中__dict__的方法。直接支持update()进行操作,避免使用locals()、vars()和eval()函数。我们可以直接看这样一个案例:

In [1]: dict_a = {'a':1, 'b':2}In [2]: dict_b = {'c':3}In [3]: class D(object): ...: def __init__(self): ...: self.d = 4 ...: self.__dict__.update(dict_a) ...: self.__dict__.update(dict_b) ...: In [4]: new_D = D()In 在这种情况下,我们在类外定义了两个字典dict_a和dict_b,字典的键值都是字符串的格式。而且我们知道,在python中不使用eval,字符串格式是不能直接作为变量名的。但是,字典通过__dict__的方法导入后。update(),字典中的所有键值都将被自动识别并作为成员变量赋给当前类。但是,这种方法有一个缺点,就是只能通过单级字典来赋值。如果遇到有层次结构的字典,它不会自动区分层次结构进行赋值,比如下面的代码:: new_D.__dict__Out[5]: {'d': 4, 'a': 1, 'b': 2, 'c': 3}In : new_D.aOut[6]: 1In 根据上一章末尾提到的这个特殊场景,我们需要递归计算字典中的元素。如果我们遇到一个嵌套的dictionary元素,我们将递归地将该元素添加到下一级的成员变量中。具体代码如下:: new_D.cOut[7]: 3

[5]

In 关于如何使用Python将字典转换成成员变量的文章到此结束。有关将Python字典转换为成员变量的更多信息,请搜索源搜索网之前的文章或继续浏览下面的相关文章。希望大家以后能多支持源搜网!: dict_a = {'f':{'h':8},'g':7}In : new_D = D()In : new_D.__dict__Out[17]: {'d': 4, 'f': {'h': 8}, 'g': 7, 'c': 3}

[6]

嵌套字典转成员变量

[7]

dict_a = {'f':{'h':8},'g':7}dict_b = {'c':3}class D: def __init__(self, *args): for arg in args: for k, v in arg.items(): if isinstance(v, dict): self.__dict__[k] = D(v) else: self.__dict__[k] = vnew_D = D(dict_a, dict_b)print (new_D.__dict__)print (new_D.f.h)

的最终输出如下:

{#39;f # 39:lt;__main__。d对象在0x 7 FD 2 f 32 a 4340 gt;
,# 39;g # 39: 7, #39;c# 39;:3}
8

可以看到,我们最终通过new_D.f.h方法成功读取了原始嵌套字典中的值。虽然这样的写法看起来不太优雅,但似乎也没有更好的解决办法。而且通过这个小问题的练习,还发现了另一个稍微有趣的问题:在python中更新字典类型时,如果关键字符串有一个点,比如parDict[# 39;group1.b # 39] = 3,只能以这样的字符串形式更新。如果使用parDict.update(group1.b=4 ),将会出现错误。这是因为点不是python中的标识符,不能用于命名。原文内容如下:

标识符的有效字符与Python 2.x中的相同:大写和小写字母A到Z、下划线_以及除第一个字符之外的数字0到9。


总结概要

本文要解决的问题场景如下:如果一个给定的字典,比如从json文件或者npz文件加载的数据,是字典的数据结构,如果我们要将这个字典赋给一个类,并使字典的键和值作为该类的成员变量名和成员变量值,那么如何实现呢?对于扁平化的字典(没有嵌套字典),我们可以直接使用update将字典中的所有键和值转换为当前类的成员变量。比较麻烦的是有嵌套字典的层次字典。这时,我们只能使用循环,递归地给类的成员变量赋值。


0

精彩评论

暂无评论...
验证码 换一张
取 消