我们知道利用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)。如此定义对象才可以有除构造阶段需要初始化的属性之外的属性。
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存储和解析的对象的详细内容,更多请关注 第一php社区 其它相关文章!