百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python中将字典转为成员变量(python字典转numpy)

off999 2024-11-02 12:32 28 浏览 0 评论

技术背景

当我们在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_adict_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}

嵌套字典转成员变量

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

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.cnblogs.com/dechinphy/p/dict-class.html

相关推荐

zabbix 7.0 安装部署 centos stream9

关闭selinux和防火墙setenforce0vim/etc/selinux/config设置为disabledsystemctlstopfirewalldsystemctlstop...

Ubuntu 操作系统常用命令详解_ubuntu各种命令

UbuntuLinux是一款流行的开源操作系统,广泛应用于服务器、开发、学习等场景。命令行是Ubuntu的灵魂,也是高效、稳定管理系统的利器。本文按照各大常用领域,详细总结Ubuntu必学...

秒变万能家庭服务器!斐讯N1 armbian安装指南

一直以来,我都想配置一台小型服务器放在家里玩一玩,但是x86架构的主机体积大功耗高,价格也不低。而树莓派的话,价格便宜一点,性能对于轻度使用也基本够用。可是树莓派仍然要两三百块钱,感觉还是有点贵。于是...

浏览器里跑Windows XP?开发者硬核复现,免安装还能玩扫雷、纸牌接龙,网友直呼:爷青回!

整理|苏宓出品|CSDN(ID:CSDNnews)你还记得上一次用WindowsXP是什么时候吗?这个诞生于2001年的操作系统,曾因操作简单、性能提升、兼容性好,迅速成为一代人...

阿里云安装飞牛教程,这次待机0功耗了

把照片、聊天记录、工作文件一股脑儿塞进网盘,却突然发现账号被封、文件被删,那一刻像被人扒光了扔大街上。昨晚,我在阿里云花29块买了台最便宜的VPS,折腾三小时,把Nextcloud装进这台小机器,手机...

【入门】【失败】Linux下mysql-8.0.22-linux-x64.tar.gz 安装

因为系统环境的一些问题,最后安装失败这篇文章只保留过程一些笔记做参考创建MySQL用户和组sudogroupaddmysqlsudouseradd-r-gmysql-s/bin/...

Jenkins 安装与部署完整指南_jenkins安装与配置windows

Jenkins安装与部署完整指南Jenkins是一款开源的自动化服务器,常用于持续集成(CI)和持续交付(CD)。本文将介绍在Linux、Windows、macOS三大平台上的安装与部署步骤,...

Nacos 安装教程_nacos安装部署

Nacos安装与生产部署增强版教程(Windows&Linux)Nacos是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台,支持几乎所有主流类型服务的发现、配置和管理。加入了版本匹配...

Linux开机自启服务完全指南:3步搞定系统服务管理器配置

为什么需要配置开机自启?想象一下:电商服务器重启后,MySQL和Nginx没自动启动,整个网站瘫痪!这就是为什么开机自启是Linux运维的必备技能。自启服务能确保核心程序在系统启动时自动运行,避免人工...

centos nginx docker-compose安装

一、nginx及docker文件准备1、docker-compose.ymlversion:'3'services:nginx:restart:always...

Nginx合集-高可用(Keepalived)_高可用 nginx

Keepalived简介Keepalived是Linux下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。它与HeartBeat实现类似的功能,...

Nginx 笔记_nginx最全教程

gcc#可能需要安装C++yum-yinstallgcc-c++installnginxbybashcd/usr/local/src##@seehttp://nginx...

JAVA面试|nginx如何解决跨域问题_nginx解决跨域问题原理

核心思想:跨域问题是浏览器的安全限制,不是服务器本身拒绝通信。Nginx作为强大的反向代理服务器,可以通过在响应中添加特定的HTTP头信息(CORS头),告诉浏览器:“这个跨域请求是我允许的,你可...

Nginx主从架构详解(图文全面总结)

Nginx是大型架构的必备技能,下面我重点详解Nginx主从架构@mikechen文章来源:mikechen.ccNginx主从在大规模Web应用和高可用部署中,Nginx作为高性能反向代理与负...

Nginx动静分离详解(原理+配置+实战)

Nginx动静分离是一种常见的Web服务优化技术,Nginx动静分离可以更好的提升性能@mikechen文章来源:mikechen.ccNginx动静分离动静分离,顾名思义,就是将Web应用中...

取消回复欢迎 发表评论: