在Python中将字典转为成员变量的方法

这篇具有很好参考价值的文章主要介绍了在Python中将字典转为成员变量的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当我们在Python中写一个class时,如果有一部分的成员变量需要用一个字典来命名和赋值,此时应该如何操作呢?这个场景最常见于从一个文件(比如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 [5]: new_D.__dict__
Out[5]: {'d': 4, 'a': 1, 'b': 2, 'c': 3}
 
In [6]: new_D.a
Out[6]: 1
 
In [7]: new_D.c

Out[7]: 3

在这个案例中,我们在类的外部定义了两个字典dict_a和dict_b,字典的key值都是字符串的格式。而我们知道字符串格式在python中如果不使用eval,是不能直接作为变量名来使用的。而通过__dict__.update()的方法将字典导入后,会自动识别其中所有的key和value值,转而赋值给当前类作为成员变量。但是这个方法有一个缺点是,只能通过单层的字典来赋值,如果遇到有层级结构的字典,是不会自动分辨层级结构进行赋值的,比如下方的代码:

In [15]: dict_a = {'f':{'h':8},'g':7}
 
In [16]: new_D = D()
 
In [17]: new_D.__dict__

Out[17]: {'d': 4, 'f': {'h': 8}, 'g': 7, 'c': 3}

嵌套字典转成员变量

根据上一个章节中最后提到的这个特殊场景,我们需要对字典内的元素进行递归,如果遇到嵌套的字典元素,则递归的将该元素添加到下一层级的成员变量中,具体代码如下所示:

#学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845

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] = v
 
new_D = D(dict_a, dict_b)
print (new_D.__dict__)

print (new_D.f.h)

最终的输出结果如下所示:

{'f': <__main__.D object at 0x7fd2f32a4340>
, 'g': 7, 'c': 3}

8

可以看到,我们最终通过new_D.f.h的方法,成功读取了原有的嵌套字典中的value。虽然这种写法看起来不是很优雅,但是似乎也没有更好的解决方案。

并且,通过这个小问题的实践,发现了另外一个略有意思的问题:对python中的字典类型进行更新时,如果key的字符串中带有点号,比如parDict['group1.b'] = 3,只能通过这样的字符串的形式进行更新,如果使用parDict.update(group1.b=4)则会发生报错,这是因为点号在python中不是一个标识符,不能用于命名,原文内容如下:

The valid characters for identifiers are the same as in Python 2.x:the uppercase and lowercase letters A through Z, the underscore _ and,except for the first character, the digits 0 through 9.

总结

本文所解决的问题场景是这样的:如果给定一个字典,比如一般从json文件或者npz文件中加载出来的数据都是字典的数据结构,如果我们希望把这个字典赋值给一个类,且使得字典的key和value分别作为类的成员变量名和成员变量值,那么该如何实现呢?对于一个展平的字典而言(没有嵌套字典),我们直接使用update就可以将字典中的所有key和value转变为当前类的成员变量。比较麻烦的是包含有嵌套字典的层级结构字典,此时我们只能使用循环,并且递归的对类的成员变量进行赋值。文章来源地址https://www.toymoban.com/news/detail-861315.html

到了这里,关于在Python中将字典转为成员变量的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Typescript中将字符串转为数值有哪些方法?

    在TypeScript中,将字符串转换为数值(即字符串到数字的类型转换)有几种方法。以下是一些常见的方法: 1、使用全局函数 parseFloat() 和 parseInt(): 2、使用 Number 构造函数: 3、使用模板字面量和 + 运算符: 4、使用 parseInt() 和 parseFloat() 方法的函数形式: 需要注意的是,这些

    2024年02月12日
    浏览(33)
  • Python 中将元组列表转换为字典

    使用 dict 类将元组列表转换为字典,例如 my_dict = dict(list_of_tuples) 。 dict 类可以传递一个元组列表并返回一个新字典。 我们使用 dict 类将元组列表转换为字典。 请注意 ,此方法仅在您的元组每个包含 2 个元素(一个键和一个值)时才有效。 或者,我们可以使用 字典推导 。

    2023年04月08日
    浏览(36)
  • 面向对象【成员变量与局部变量、方法声明与作用】

    Java中的成员变量是指 类中声明的变量 ,也称为实例变量或属性。它们与方法一样属于类的成员,不同之处在于,它们存储在对象(堆)中而不是栈中,并且每个对象都有自己的一组值。 成员变量可以用来描述一个对象的状态,例如人的年龄、学生的姓名等。它们可以具有pub

    2024年02月10日
    浏览(51)
  • 定义一个圆类Circle,成员变量:半径 radius;成员方法:构造方法、get和set半径的方法、计算面积和周长的方法。

    (1)定义一个圆类Circle,成员变量:半径 radius;成员方法:构造方法、get和set半径的方法、        计算面积和周长的方法。定义圆柱和圆锥类,定义相应的变量成员和成员方法。使用以上类编         程,输出圆的面积和圆柱、圆锥的体积。

    2024年02月12日
    浏览(36)
  • 使用Python保存和加载 字典 变量

    使用Python保存和加载 字典 变量node_message

    2024年02月14日
    浏览(30)
  • 如何在 JavaScript 中将数组转为对象

    首先,我们需要明白对象具有键和值。 如果我们想把某个东西转换成一个 对象 ,我们需要传递具有这两个要求的东西:键和值。 满足这些要求的参数有两种类型: 具有嵌套键值对的数组 Map 对象 这是一个带有键值对的嵌套数组 当我们应用它时,我们可以使用 Object.fromEnt

    2024年02月01日
    浏览(41)
  • COLMAP中将旋转矩阵转为四元数的实现

          instant-ngp中执行scripts/colmap2nerf.py时,在colmap_text目录下会生成cameras.txt、images.txt、points3D.txt三个文件:       1.cameras.txt:       (1).该文件包含数据集中所有重构相机(all reconstructed cameras)的内在参数(intrinsic parameters),每个相机占用一行;       (2).参数的长度是可变的,

    2024年02月07日
    浏览(29)
  • 【Python 笔记(二)——基本语句 变量类型 字符串 序列 列表与元组 字典与集合】

    在 Python 中,基本语句可以帮助我们完成一些基本的操作,如控制流程、定义函数等。以下是 Python 中的几种基本语句: if 语句 if 语句用于判断某个条件是否成立,如果条件成立则执行相应的代码块。 for 语句 for 语句用于遍历序列中的元素,依次执行相应的代码块。 while 语

    2024年02月08日
    浏览(35)
  • SQL地址门牌排序,字典序转为数字序

    页面有一批地址数据查询,结果字符排序默认是字典序的,所以造成了门牌3号在30号之前,影响用户体验; 想到办法是提取名称的数字再排序。数据量大有两千多万条,不可能都跑一边提取排序,要么冗余一个字段存放提取的数字? “如非必要,勿增实体”——奥卡姆剃刀

    2024年02月11日
    浏览(23)
  • 100天精通Python丨基础知识篇 —— 05、7大基础数据类型详解(变量、列表、集合、字典、元组)

    《100天精通Python专栏 - 快速入门到黑科技》 是由 CSDN 内容合伙人丨全站排名 Top 4 的硬核博主 不吃西红柿 倾力打造,专栏分为基础知识篇和黑科技应用篇。 基础知识篇 以理论知识为主,旨在帮助没有语言基础的小伙伴,学习我整理成体系的精华知识,快速入门构建起知识框

    2023年04月18日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包