【问题标题】:Saving state of complex, scripted objects保存复杂的脚本对象的状态
【发布时间】:2011-09-09 12:55:28
【问题描述】:

在 C++ 中,我向 Python 公开(使用 Boost)以下两个类:

struct Foo {
    // Empty
};

struct FooContainer {
    // I use boost::shared_ptr for compatibility with Boost.Python
    vector<boost::shared_ptr<Foo>> foos_;
};

在 Python 方面,我可能会创建一种特殊类型的 Foo,它实际上会做一些事情,而不仅仅是一个空类,然后将它添加到 FooContainer:

class Useful(Foo):
    def __init__(self, a, b):
        self.a = a
        self.b = b

x = Useful(3, 5);
# Add 'x' to a `FooContainer`

回到 C++ 端,FooContainer 现在有一些 Foo,但它不知道也不关心它们来自 Python。应用程序运行了一段时间,Foo 对象中的数据发生了变化……

然后我决定要保存程序的状态,以便以后加载它。但问题是 FooContainer 对它的 Foo 对象知之甚少,它甚至不知道它们来自 Python,而且我不想用不属于它的数据污染我的 FooContainer(单-责任原则等等)。

您对我应该如何组织我的应用程序,以便以清晰的方式保存和加载数据以及加载新数据(即不是从我过去保存的状态)有什么建议吗?

【问题讨论】:

    标签: c++ python scripting embedding boost-python


    【解决方案1】:

    您可以使用boost::python/pickle,并从 python 中保存数据。我对酸洗套件的经验有限,但如果您在派生自 python 的类中覆盖适当的酸洗方法,它应该可以工作(请参阅我对this question 的回答)。

    【讨论】:

      【解决方案2】:

      您已经拥有创建 Foos 的 python 代码,我们将其称为 populateFoos,然后您的程序会以某种方式调用它。

      现在您需要的下一件事情是执行保存和加载的storeFoosloadFoos 函数。如果您想保持其通用性,请将它们定义为 storeFuncloadFunc(或 callback,具体取决于上下文)。

      根据您的程序结构,您可能还需要在 python 中保存所有已创建(或关联到容器)的 foo 列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 2010-12-27
        • 2010-12-04
        • 2012-03-25
        • 2011-10-19
        相关资源
        最近更新 更多