在C ++中,我将以下两个类(使用Boost)暴露给Python:
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现在有一些Foos,但它不知道或不关心它们来自Python。应用程序运行一段时间,Foo对象中的数据发生变化......
然后我决定要保存程序的状态,以便稍后加载它。但问题是FooContainer对它的Foo对象了解不多,它甚至不知道它们来自Python,我不想用我真正属于它的数据污染我的FooContainer(单个 - 责任原则和所有这些)。
您对我应该如何组织我的应用程序有任何建议,以便保存和加载数据,以及加载新数据(即不是来自我过去保存的状态)可以以明确的方式完成吗?
答案 0 :(得分:2)
您可以使用boost::python/pickle,并保存python中的数据。我对酸洗套件的经验有限,但如果你在python派生的类中覆盖适当的酸洗方法,它应该可以工作(参见我对this question的回答)。
答案 1 :(得分:1)
您已经拥有创建Foos的python代码,我们可以将其称为populateFoos
,并以某种方式让您的程序调用它。
现在您需要的是storeFoos
和loadFoos
功能,它可以进行保存和加载。如果您想保持通用,请将它们定义为storeFunc
和loadFunc
(或callback
,具体取决于上下文。)
根据您的程序结构,您可能还需要在python中保留已创建(或与容器相关联)的所有foos的列表。