【转载请注明来自SimuWorld.linkka.com】

很多时候我都遇到需要把一些C或者C++的程序转换成Python,或者在制作Python程序时候需要创建和C/C++程序中对应的数据结构。

例如,我的C程序中有这样一个结构(名字叫HEADER):

struct HEADER

{

int version;

double var;

char * desc;

};

现在我在Python中也需要使用这个结构(例如,这是一个二进制文件的头信息,我需要读取这个二进制文件;或者这个struct中的信息我在python程序中也需要保留)。

当然Python是无所不能的,你可以有无数种方式来生成并存储这些数据。最简单的,你可以创建一个列表或者dict,很轻松就可以完成任务。但是这里有一个更简便也灵活得多的方法,这得益于我参考互联网上的相关文档并加上一些自己的思考。

具体做法是创建一个python类,并利用python类自带的字典属性来保存数据。因此我们不需要显示地创建一个词典。看:

class Header:

def __init__(self,**data):

self.__dict__.update(data)

对就是这些了,就是这么简单。解释一下细节:

首先,这个类是一个python的老式类(具体参见下文),创建时候系统给他创建了一个内置的dict对象,可以通过self.__dict__来访问到。

__init__这个函数是这个类实例化时一定会呼叫的函数,所以我们加了一个参数data给他,来传递我们要存储的所有数据。

data前面的两个星号意思是我们给他的所有data都会被组合成一个dict对象传给函数,data中数据的个数是任意多的。

update函数的调用保证了在我们生成这个类实例的时候,这个内置字典会记录我们送给他的所有参数。

看看用法吧:

1. 实例化

>>> h=Header(version=var1, var=var2, desc="something")

2. 看看那些结构值都存储好没有:

>>> h.version

var1

>>> h.var

var2

>>> h.desc

something

哈,没问题哦,就像使用C结构一样容易。 至此好像任务已经完成了,但是稍等还有一点问题,

如果我们需要给这个存储的“结构”添加点成员怎么做?

太容易不过了,因为我们把数据都存放在一个python类的字典对象中,这比直接存储在一个独立的dict对象中要好。

为什么呢?好处是我们可以随时给一个不存在的类属性分配值,这个类属性会自动在类的内置词典中创建。看:

刚才那个类实例h是没有叫 any 这个名字的‘属性’的,也就是

>>> h.any 没有值

但是我们可以简单的在h创建以后加入它,只要这样

>>> h.any = "anything"

OK, 以后你就可以使用h.any了,很灵活吧。

可是这种灵活性有的时候并不是我们希望的。比如,我们不希望这个Header中的数据成员数目被改动,只要一些预设值!这时上面的灵活性就成了不希

望的结果,因为这个结构中保存数据的个数是可以随时调整的。Python是可以完成这个附加任务的,一个简单的方法是使用python的新型类,也就是继

承于object类的子类。使用新型类的好处是,我们可以添加一个隐含成员__slots__,当这个属性存在时,这个类的『实例』是没有内置字典的!也

就是说,我们不能给这个实例化的对象随意添加成员变量,它所拥有的属性是在类成员__slots__中规定好的,不能添加删除了。但是slots中规定属

性的值还是可以改变的。这样完美实现的我们的要求。

下面看看具体实现:

class Header(object): #新式类

__slots__=['version','var', 'desc']

def __init__(self, **data):

for i, key in enumerate(self.__slots__):

self.__slots__[i] = data[key]

吼,这次好了,可以随意创建一个实例,但是只能用那三个定义好的属性,添加新的是不允许的,这样可以保证我们定义‘结构’的‘安全性’。

就说这些,其实问题是很简单的,你当然可以简单地用一个字典实现,但是还是那句话,不够灵活(添加新成员要呼叫字典的方法才行,或者不能限制成员),但是上面的类可以实现。

c语言python字典结构_在python中创建类似C语言中struct的结构来保存数据相关推荐

  1. python字典调用_【python Dict】 python 字典操作

    python字典 是一个无序.以键值对存储的数据类型,数据关联性强.唯一一个映射数据类型.键:必须是可哈希(不可变的数据类型:字符串.数字.元组.bool)值,并且是唯一的 None: none 是一 ...

  2. c语言整形符号位_基本整形型变量-在C语言中,整型常量与整型变量的区别是什么?举例...

    用什么关键字定义基本整型变量 int表示整型变量,long表示长整型变量,一般用int就足够了,例如 int a: int b = 2; 整型.短整型.长整型的区别是什么? 1.整型变量可以分为4类: ...

  3. python 生成可执行文件_在Cython中创建一个可执行文件

    你想要的是Cython编译器的–embed标志. 关于它没有大量的文档,但this是我能找到的.它确实链接到一个简单的工作示例. 要将Cython源代码编译为可以编译为可执行文件的C文件,可以使用cy ...

  4. python 创建目录时间_在目录中创建带有日期时间名称和子文件的dir(Python)

    我目前正在使用pythonv2.7在Linux上创建一个目录,目录名为日期和时间(即27-10-2011 23:00:01).我的密码是以下:在import time import os dirfmt ...

  5. python 空矩阵_在NumPy中创建空数组/矩阵的方法

    如何在NumPy中创建空数组/矩阵? 在添加行的情况下,你最好的选择是创建一个与数据集最终一样大的数组,然后向它添加数据 row-by-row: >>> import numpy & ...

  6. 用python描述车_使用Python探索二手车市场(含代码)

    原标题:使用Python探索二手车市场(含代码) 感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式 ...

  7. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  8. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  9. Python之pandas:特征工程中数据类型(object/category/bool/int32/int64/float64)的简介、数据类型转换四大方法、案例应用之详细攻略

    Python之pandas:特征工程中数据类型(object/category/bool/int32/int64/float64)的简介.数据类型转换四大方法.案例应用之详细攻略 目录 特征工程中数据 ...

  10. sort在c语言中的作用,c语言中sort的用法详解.docx

    c语言中sort的用法详解.docx C语言中SORT的用法详解C语言的学习很多是比较复杂的,那么C语言中SORT的用法的用法你知道吗下面学习啦小编就跟你们详细介绍下C语言中SORT的用法的用法,希望 ...

最新文章

  1. Postgres数据库备份与还原命令
  2. 从KPI到OKR,高阶产品人如何推动业务高速增长
  3. 哈工大与北大提出注意力引导的图像去噪
  4. golang Java_goLang
  5. neo4j︱Cypher 查询语言简单案例(二)
  6. CodeForces 622A--F - Infinite Sequence
  7. 【POJ 3057】Evacuation【最大流+二分】
  8. CentOS6.7 Linux Squid 代理服务器安装配置
  9. 用Raspberry Pi作AirPlay服务端
  10. 微信小程序授权登录详细解析
  11. 计算机中丢失msvcr100.dll怎么办,msvcr100.dll
  12. Java LeetCode每日一题-从易到难带你领略算法的魅力(七):Z 字形变换
  13. 路由器自动获取ip失败
  14. 直接插入法(C语言版本)
  15. 使用经验-深度学习云服务器mist GPU
  16. 经典点云去噪算法总结
  17. B站才是头条系的大敌
  18. 国产网页在线编辑器kindeditor的使用
  19. 微信互动营销有哪些方式?
  20. IT运维人员,该如何规划自己的职业路?

热门文章

  1. idea类生成序列号
  2. DataGridView:DataGridView控件清空绑定的数据
  3. 2015.4.7-C#入门基础(一)
  4. 基于用户名/密码认证和流量控制 安装pam_mysql(太麻烦,已放弃;以下步骤可以参考,有报错解决...
  5. ASP.NET的Application简介1
  6. xcode自动刷新resource下的文件
  7. DNS-实验3_委派子域和转发
  8. Intel DPDK 源代码分析
  9. SNMP报文抓取与分析(二)
  10. Linux 任务控制的几个技巧( , [ctrl]-z, jobs, fg, bg, kill)