【问题标题】:Is there a way to save a class's state in a specific moment in time?有没有办法在特定的时间保存班级的状态?
【发布时间】:2018-10-20 05:04:44
【问题描述】:

在 Python 3 中,是否有办法创建一个变量,该变量可以在某个时刻保持类的不变状态?如果有,我一定错过了它的术语。我也不是在谈论静态,我的属性需要能够改变。

它会像这样工作:

class_save = [Class(a,b,c).attribute, Class(d,e,f).attribute]

static_save = class_save

#if I do this
class_save.remove(static_save[1])

#class_save should now equal [Class(a,b,c).attribute]
#static_save should still be equal to [Class(a,b,c).attribute, Class(d,e,f).attribute]

【问题讨论】:

  • 您能用更通俗易懂的语言谈论您要解决的问题吗?例如,您是否尝试在某种应用程序中实现“撤消”和“重做”?
  • class_save 是一个列表,class_save[:] 是该列表的副本。 del alist[1] 从列表中删除一个项目。
  • Class(a,b,c) 看起来像一个类实例,而不是一个“状态”。 Class[a,b,c).attribute 可以是任何类型的对象。所以class_save 只是一个未指定对象的列表。
  • 看起来你只是在要求热复制一个对象。这就是你想要的吗?
  • 是的,你只是想要一份副本

标签: python class static


【解决方案1】:

你的意思是对象序列化吗?使用pickle 库,您可以使用pickle.dumps(object) 进行序列化,使用pickle.loads(serialized_object) 进行反序列化。

【讨论】:

    【解决方案2】:

    在评论中,你说:

    我正在编写一个国际象棋游戏,并且正在为一个车实现移动。我有一个函数可以列出所有可能的车子移动,然后检查列表以确保没有任何移动被其他“ChessPiece”类阻止。我需要一种方法来引用该函数创建的原始列表,即使在我从中删除了一些元素之后也是如此。

    好的,所以你有一个原始的移动列表:

    all_moves = [move1, move2, move3, ...]
    

    然后你过滤它:

    valid_moves = [move for move in all_moves if is_valid_move(move)]
    

    这为您提供了两个列表:第二个包含对第一个列表元素子集的引用。不需要深拷贝,也不需要过多的内存分配。

    【讨论】:

    • 我认为我的问题在于建立is_valid_move() 函数。我将更多地尝试看看是否可以找到更优雅的检查解决方案。感谢您的帮助!
    【解决方案3】:

    如果你是内存中的完整副本,你需要一个深拷贝

    copy.deepcopy(x)

    如果您希望它在磁盘上冻结pickle.dump 它。

    【讨论】:

    • 我看到 bhargava 也给出了类似的答案,我一直在尝试阅读它,但您能解释一下创建深拷贝与序列化之间的区别吗?
    • @SignalProcessed 序列化是将可以随机访问的内存对象转换为必须以连续(流)方式访问的数据,例如在保存到磁盘或通过套接字推送时.深拷贝将整个内存对象图复制到内存中的不同位置,它根本不接触磁盘。深拷贝和浅拷贝的区别在于,浅拷贝不会递归调用引用对象上的拷贝,因此只会拷贝对象图的根。
    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多