2024-06-15 21:54:30 发布
网友
我有一些boost python类,我在python中实例化了这些类。我想复制它们。所以,如果我有
p = Bernoulli(0.5)
我想这么做
但是如果我不知道p的类型呢?我试着这么做:
q = copy.deepcopy(p)
但Python说它不能腌制p
我唯一的解决方案是在Bernoulli的接口中添加clone()函数吗?或者我可以让这个方法自动生成吗?可以复制.deepcopy被迫与Boost.python物体?在
来自http://mail.python.org/pipermail/cplusplus-sig/2009-May/014505.html
#define PYTHON_ERROR(TYPE, REASON) \ { \ PyErr_SetString(TYPE, REASON); \ throw bp::error_already_set(); \ } template<class T> inline PyObject * managingPyObject(T *p) { return typename bp::manage_new_object::apply<T *>::type()(p); } template<class Copyable> bp::object generic__copy__(bp::object copyable) { Copyable *newCopyable(new Copyable(bp::extract<const Copyable &>(copyable))); bp::object result(bp::detail::new_reference(managingPyObject(newCopyable))); bp::extract<bp::dict>(result.attr("__dict__"))().update( copyable.attr("__dict__")); return result; } template<class Copyable> bp::object generic__deepcopy__(bp::object copyable, bp::dict memo) { bp::object copyMod = bp::import("copy"); bp::object deepcopy = copyMod.attr("deepcopy"); Copyable *newCopyable(new Copyable(bp::extract<const Copyable &>(copyable))); bp::object result(bp::detail::new_reference(managingPyObject(newCopyable))); // HACK: copyableId shall be the same as the result of id(copyable) in Python - // please tell me that there is a better way! (and which ;-p) int copyableId = (int)(copyable.ptr()); memo[copyableId] = result; bp::extract<bp::dict>(result.attr("__dict__"))().update( deepcopy(bp::extract<bp::dict>(copyable.attr("__dict__"))(), memo)); return result; }
要使用它:
是的,您可以通过在对象上实现__setstate__和__getstate__方法,使boost::python对象具有深度可复制性(也可拾取)。在
__setstate__
__getstate__
基本上,__getstate__应该返回表示对象内部状态的(python)对象,而__setstate__显然接受所述对象并更新对象的状态。在
如果您的对象接受__init__的参数,那么还应该考虑实现__getinitargs__。在
__init__
__getinitargs__
有关详细信息,请参见Pythondocs。在
对于复制,您可以实现^ {< CD1>}和^ {< CD2>}特殊方法(其中一个可以根据类的C++复制语义包装复制构造函数),或者添加pickling support。copy模块将使用特殊的复制方法(如果可用),否则使用酸洗方法。在
copy
下面是一个使用复制构造函数实现__copy__的示例:
__copy__
template<typename T> const T copyObject(const T& v) { return v; } boost::python::class_<C>("C").def("__copy__", copyObject<C>);
来自http://mail.python.org/pipermail/cplusplus-sig/2009-May/014505.html
要使用它:
^{pr2}$是的,您可以通过在对象上实现
__setstate__
和__getstate__
方法,使boost::python对象具有深度可复制性(也可拾取)。在基本上,
__getstate__
应该返回表示对象内部状态的(python)对象,而__setstate__
显然接受所述对象并更新对象的状态。在如果您的对象接受
__init__
的参数,那么还应该考虑实现__getinitargs__
。在有关详细信息,请参见Pythondocs。在
对于复制,您可以实现^ {< CD1>}和^ {< CD2>}特殊方法(其中一个可以根据类的C++复制语义包装复制构造函数),或者添加pickling support。
copy
模块将使用特殊的复制方法(如果可用),否则使用酸洗方法。在下面是一个使用复制构造函数实现
__copy__
的示例:相关问题 更多 >
编程相关推荐