修改 Boost Python 包装类?

Posted

技术标签:

【中文标题】修改 Boost Python 包装类?【英文标题】:Amending a Boost Python wrapper class? 【发布时间】:2013-02-04 11:50:32 【问题描述】:

如何访问已为给定 C++ 类注册的 boost::python::class_ 对象?我正在导入一个 boost::python 模块,它为 boost::property_tree::ptree 定义了一个包装器,但我想在这个包装器定义中添加其他方法。当我尝试创建一个新的包装器时,Boost Python 抱怨已经声明了一个处理程序,并忽略了我的新定义。

有什么想法吗?

【问题讨论】:

使用python将方法添加到包装器会不会有问题?这应该很简单。 哦,是的!完全忘记了我能做到这一点。我试试看…… 完美运行。我决定回答我自己的问题并接受它。希望其他人会发现它有用。 【参考方案1】:

按照 daramarak 的建议以及 Boost Python 教程 Extending Wrapped Objects In Python,我从 python 中扩展了该类。 Python 和 Boost::Python 对绑定成员函数和第一个参数是对象引用(或指针)的函数几乎没有区别。因此,您可以像这样在 C++ 中定义一个函数:

bool ptree__contains(boost::property_tree::ptree* self, const std::string& key) 
    return self->find(key)!=self->not_found();

然后像这样在 Python 中扩充导入的类:

from other_module import ptree
from my_module import ptree__contains

# The __contains__ method is a special api function 
# that enables "foo in bar" boolean test statements
ptree.__contains__ = ptree__contains

test_ptree = ptree()
test_ptree.put("follow.the.yellow.brick.road", "OZ!")

print "follow.the.yellow.brick.road" in test_ptree
# > true

我将我的扩充代码添加到我的模块的__init__.py,这样我的模块的任何导入都会自动将所需的方法添加到外部对象。我定义了一个修改类的函数,调用这个函数,然后删除它以清理我的命名空间。或者,您可以将此函数从您的 __all__ 列表中排除,以防止它被 from module import * 语句导出。奇迹般有效!再次感谢 daramarak。

【讨论】:

不错的解决方案和有据可查的 +1。我们需要更多 boost::python 答案。【参考方案2】:

我有一个类似的问题,但有一个区别:由于类导出定义在我自己的代码中,我能够更改第一次调用 boost::python::class_ 的部分。

如果您的情况也有可能,解决方案可能如下所示:

static auto ptree_class_ = boost::python::class_< ptree > ( "ptree" );

// somewhere later in your code:
ptree_class_.def("contains", &ptree__contains);

这消除了对额外 Python 代码的需求——所有这些都在 C++ 中完成。

在这里你可以找到我原来的解决方案:https://***.com/a/30622038/4184258

【讨论】:

以上是关于修改 Boost Python 包装类?的主要内容,如果未能解决你的问题,请参考以下文章

Boost Python 包装的虚拟类子返回错误:与 C++ 签名不匹配

Boost.Python 如何拥有 C++ 类?

boost-python:如何提供自定义构造函数包装函数?

Boost python getter/setter 同名

序列化具有嵌入类的boost类,但仅对包装器中的信息进行序列化

python 这是一个包装FBX类,可用于访问和修改FBX场景