如何保存属性也是对象并且在多个级别上的python对象?

Posted

技术标签:

【中文标题】如何保存属性也是对象并且在多个级别上的python对象?【英文标题】:How to save a python object whose attributes also are objects and that on multiple levels? 【发布时间】:2019-02-07 23:02:25 【问题描述】:

你好,我用 Python 用 pygame 做了一个国际象棋游戏。

为此,我制作了一个我也制作的“国际象棋游戏”类的对象。 现在我想保存游戏,以便我们以后下棋。

我知道可以使用 pickle(或其他模块,如 json 和 hdf5)来保存我的游戏。 我知道,如果我在 pickle.dump 方法的参数中提供变量的字典,pickle 只能让我保存对象。

问题如下: 如何保存一个python对象,它的属性也是对象并且是多层次的?

解释一下自己: 我已经创建了我的“国际象棋”类的对象,其属性包含其他对象。

例如,“棋盘”是国际象棋的一个属性,是我的“棋盘”类的一个对象, 并且板还包含对象, 其中一个是所有片段的网格(它是由列表中的列表组成的矩阵),网格的每个元素都是我的“片段”类的对象“片段”。

那么有没有一种简单的方法可以保存我所有的游戏属性,而不必分解每个对象来获取它们的字典? 如果是,是否可以根据需要多次保存包含其他对象的对象?

提前非常感谢您! :D

【问题讨论】:

使用shelve 模块。 哇!很简单,非常感谢。 【参考方案1】:

我相信pickle 模块实际上可以根据您描述的对象层次结构正确序列化您的对象:

In [1]: import pickle

In [2]: class Piece():
   ...:     def __init__(self, name):
   ...:         self.name = name
   ...:

In [3]: class Board():
   ...:     def __init__(self, pieces):
   ...:         self.pieces = pieces
   ...:

In [4]: board = Board([Piece("knight"), Piece("king")])

In [5]: save = pickle.dumps(board)

In [6]: restored_board = pickle.loads(save)

In [7]: for piece in restored_board.pieces:
   ...:     print(piece.name)
   ...:
knight
king

【讨论】:

以上是关于如何保存属性也是对象并且在多个级别上的python对象?的主要内容,如果未能解决你的问题,请参考以下文章

uni-app动态添加根级别的响应式属性

python面向对象

Python pickle 如何保存对象?

Python的列表和元组的区别

python--创建类属性

如何在 python 3 中将类对象列表“保存”到我的程序中?