Python实现支持JSON存储和解析的对象

我们知道利用json模块可方便的将python基本类型(dict、list等)数据永久的存储成文件,同时也可以通过自定义转换函数和继承json encode&decode的方法实现自定义类的存储。本文就在前文“ python json模块”的基础上,实现python支持json存储的对象。

对象能够采取JSON存储和解析是有很大意义的。例如机器学习中所有分类算法的训练过程中都存在大量的数据计算,如果每次启动分类都需要重新训练分类算法浪费资源且没有效率,如果能够将训练产生的分类算法对象保存起来,那么除非需要算法调优,以后只需载入即可。另一方面,对象能够进行JSON解析和存储也使得其可以在网络上传送,这在当下云计算、分布式数据处理中都有非凡的意义。

为了实现自存储和解析,定义对象的关键操作有:

0,将object_json.py copy至包中,定义对象的模块导入object_json:import object_json。

1,init()函数要支持可变数量的函数调用,即要写成init(self, …, , **args)。如此定义对象才可以有除构造阶段需要初始化的属性之外的属性。

立即学习“Python免费学习笔记(深入)”;

2,对于对象构造阶段必须初始化的属性,init()函数中的形参必须与这些属性名称完全相同,如此才能通过字典‘key’: value对构造对象。

3,定义一个属性‘name’–该对象实例的名称,利用inspect模块实现。‘name‘属性主要用于产生对象存储时默认的文件名称。

4,定义jsonDumps()和jsonLoadTransfer()方法,通过objectLoadFromFile()完成对象JSON文件load和新对象创建。

(i)jsonDumps()用于将对象转换成dict并通过json.dumps()将对象存储成json文件,若用户不指定文件名则以instancename.json为默认存储文件。由于JSON只支持python基本类型,因此若对象中有一些其他类型(如numpy matrix),则需将其转化成Python基本类型(如matrix.tolist()将matrix转换成list)。

(ii)jsonLoadTransfer()用于完成数据格式的转换,将一些对象属性从基本类型转化成需要的类型(如mat(list)将类型从list转换成matrix),若对象只有Python基本类型则可以省略该方法。创建完整、可用对象过程是:

obj = objectLoadFromFile()   obj.jsonLoadTransfer()

登录后复制

下面的代码就是支持自定义对象进行JSON存储和解析的object_json模块源码。

import json   import inspect    import pdb   def object2dict(obj):          #convert object to a dict          d = {'class':obj.class.name, 'module':obj.module}          d.update(obj.dict)          return d   def objectDumps2File(obj, jsonfile):       objDict = object2dict(obj)       with open(jsonfile, 'w') as f:           f.write(json.dumps(objDict))   def dict2object(d):          '''convert dict to object, the dict will be changed'''           if'class' in d:              class_name = d.pop('class')              module_name = d.pop('module')              module = import(module_name)              #print 'the module is:', module              class_ = getattr(module,class_name)              args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args             #print 'the atrribute:', repr(args)           #pdb.set_trace()           inst = class_(**args) #create new instance          else:              inst = d          return inst   def objectLoadFromFile(jsonFile):       '''load json file and generate a new object instance whose name filed      will be 'inst' '''      with open(jsonFile) as f:           objectDict =json.load(f)       obj = dict2object(objectDict)       return obj   #test function      if name  == 'main':       class Person(object):              def init(self,name,age, **args):               obj_list = inspect.stack()[1][-2]               self.name = obj_list[0].split('=')[0].strip()#object instance name               self.name = name                  self.age = age           def repr(self):                  return 'Person Object name : %s , age : %d' % (self.name,self.age)           def say(self):               #d = inspect.stack()[1][-2]               #print d[0].split('.')[0].strip()               return self.name          def jsonDumps(self, filename=None):               '''essential transformation to Python basic type in order to              store as json. dumps as objectname.json if filename missed '''              if not filename:                   jsonfile = self.name+'.json'               else: jsonfile = filename               objectDumps2File(self, jsonfile)           def jsonLoadTransfer(self):#TBD               '''essential transformation to object required type,such as              numpy matrix.call this function after newobject = objectLoadFromFile(jsonfile)'''              pass      p = Person('Aidan',22)            #json.dumps(p)#error will be throwed       #objectDumps2File(p,'Person.json')       p.jsonDumps()       p_l = objectLoadFromFile('p.json')       print 'the decoded obj type: %s, obj:%s' % (type(p_l),repr(p_l))

登录后复制

Python类有新旧两种,py 2.2 后类定义继承 object 的目的是使这个类成为 new style class, 没有继承 object 的为传统classic class(最终也会继承object)。

类定义中如下两种方法:

class Person():   class Person(object)

登录后复制

其区别在于:

若创建新的Person instanc test,则type(test)的输出分别为:

   

登录后复制

inspect 模块提供了一系列自省函数,它可以获取模块,类,方法,函数,traceback,帧对象,代码对象的信息。常用的方法getmembers,ismodule,getcallargs,isclass等,

以上就是Python实现支持JSON存储和解析的对象的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2275458.html

(0)
上一篇 2025年2月27日 14:34:15
下一篇 2025年2月24日 00:50:14

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 使用Docker部署Python应用的方法总结

    本篇文章源自作者团队在长期开发过程中总结的宝贵经验,其中supervisor、gunicorn以及nginx更是在使用python开发web应用时最常用的软件,因此对于打算使用docker部署python应用的读者而言,这些最佳实践是很有参…

    编程技术 2025年2月27日
    200
  • 10种Python开发者节省时间的方法分享

    python 是一个美丽的语言,可以激发用户对它的爱。所以如果你试图加入程序员行列,或者你有点厌倦c++,perl,java 和其他语言,我推荐你尝试python. Python有很多吸引程序员的功能 ,它易学,面向对象,字节码编译,免费且…

    2025年2月27日 编程技术
    200
  • 详解利用Python破解验证码实例代码

    一、前言本实验将通过一个简单的例子来讲解破解验证码的原理,将学习和实践以下知识点:      Python基本知识      PIL模块的使用二、实例详解安装 pillow(PIL)库: $ sudo apt-get update$ sud…

    2025年2月27日
    200
  • python的内存管理详细介绍

    语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是c语言的手工管理,还是java的垃圾回收,都成为语言最重要的特征。这里以python语言为例子,说明一门动态类型的、面向对象的语言的内存管理方式。 对象的内存使用 赋…

    2025年2月27日 编程技术
    200
  • Python制作钉钉加密/解密工具详细介绍

    又是很久没有写技术博客了,盖因最近都在学习知识,也没有总结出什么值得分享的内容,所以一直停笔至今。最近的工作和钉钉的开发打上了交到,官方并没有提供任何Python的SDK,于是只能全部自己写。现在我将其中实现起来相对费时间的“加密/解密/签…

    2025年2月27日
    200
  • 使用Python实现一个颜色色值转换的小工具介绍

      需求说明  公司的 UI 设计小哥,已经转用 Zeplin 很久了。Zeplin 的设计稿展示页面的颜色色值使用十进制的 RGB 表示的,在 Android 中的颜色表示大多情况下都需要十六进制的 RGB 表示。我的数学没有好到直接看到…

    2025年2月27日 编程技术
    200
  • 详解使用python实现删除文件或文件夹实例代码

    python 实现删除文件或文件夹          最近自己学习Python 的知识,自己学习抓取网页的内容知识等,在学习的时候Python 删除文件夹或者文件知识的时候,觉得本篇内容不错,推荐给大家。实例代码,仔细看注释明细: #-*-…

    编程技术 2025年2月27日
    200
  • 详解python根据正则表达式提取指定的内容实例介绍

    python 根据正则表达式提取指定的内容 正则表达式是极其强大的,利用正则表达式来提取想要的内容是很方便的事。   下面演示了在python里,通过正则表达式来提取符合要求的内容。 实例代码: import re #   正则表达式是极其…

    2025年2月27日
    200
  • 详解Python正则表达式的高级用法

    对于python来说,学习正则就要学习模块re的使用方法。本文将展示一些大家都应该掌握的高级技巧。 编译正则对象 re.compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换…

    2025年2月27日 编程技术
    200
  • Python流程控制语句的方法

    人们常说人生就是一个不断做选择题的过程:有的人没得选,只有一条路能走;有的人好一点,可以二选一;有些能力好或者家境好的人,可以有更多的选择;还有一些人在人生的迷茫期会在原地打转,找不到方向。对于相信有上帝的人来讲,这就好像是上帝事先为我们制…

    2025年2月27日
    200

发表回复

登录后才能评论