在Python中序列化用户定义的类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Python中序列化用户定义的类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2165字,纯文字阅读大概需要4分钟。
内容图文
![在Python中序列化用户定义的类](/upload/InfoBanner/zyjiaocheng/688/d9ec596f46d8416ab875f9bac8338477.jpg)
有一个关于序列化我定义的类的问题.我有一些像
class Foo:
def __init__(self, x, y):
self.x = x, self.y = y
def toDict(self):
return dict(Foo = dict(x = self.x, y = self.y))
然后是一个可以包含多个Foos的类,例如:
class Bar:
def __init__(self):
self.foos = [Foo(a, b), Foo(1, 2)]
虽然这是对实际结构的过度简化(嵌套起来比这要多得多),但这是一个相当不错的概述.用于此目的的实际数据来自没有任何实际结构的伪XML文件,因此我根据提供给我的规范编写了一个解析器,因此我现在将所有数据归入我定义的一系列类中,结构体.
我想要做的就是将我拥有的数据放入JSON中,但是我真的没有找到一个好方法(我是Python的新手,这是我的第一个实际项目).
我已经在Foo中定义了一个方法toDict(),该方法根据信息创建了一个字典,但是显然不会像我希望在尝试使用多个Foos序列化Bar时产生效果.
有谁能做到这一点的好方法?在过去的几天里,这几乎是不间断的学习/代码节,而我对此毫无想法,这是项目的最后一部分.我知道Python的JSON模块,但这对我将数据传递到可以传递给json.dump()的字典(或类似内容)的特殊问题没有帮助.
让我知道是否可以进行任何澄清.
谢谢,
T.J.
解决方法:
几条评论.第一:
> xml.dom.minidom是内置的Python DOM实现.显然,如果该文件实际上不是XML,则将无法使用其内置的解析功能,但是无论如何,您似乎都在从文件中构建树状结构,在这种情况下,您也可以使用渺小.
好的,从此以后,我将假定您有充分的理由编写自己的树式结构而不是使用内置函数.
>您确定节点应该是类吗?当您真正需要的只是一堆嵌套的dict时,这看起来就像是很多结构:
root = {
"foo1": { "bar1": "spam", "bar2": "ham"},
"foo2": { "baz1": "spam", "baz2": "ham"},
}
你明白了.
好的,也许您确定需要将各个节点作为类.在这种情况下,它们都应该继承自某个BaseNode类,对吗?毕竟,它们本质上是相似的.
>在那种情况下,定义一个BaseNode.serialise方法,该方法可以有效打印有关其自身的一些信息,然后对其所有子项调用序列化.这是一个递归问题.您也可以使用递归解决方案,除非您的树确实真正嵌套.
json库允许您子类化JSONEncoder来执行此操作.
>>> import json
>>> class ComplexEncoder(json.JSONEncoder):
... def default(self, obj):
... if isinstance(obj, complex):
... return [obj.real, obj.imag]
... return json.JSONEncoder.default(self, obj)
...
>>> dumps(2 + 1j, cls=ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder().encode(2 + 1j)
'[2.0, 1.0]'
>>> list(ComplexEncoder().iterencode(2 + 1j))
['[', '2.0', ', ', '1.0', ']']
内容总结
以上是互联网集市为您收集整理的在Python中序列化用户定义的类全部内容,希望文章能够帮你解决在Python中序列化用户定义的类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。