修改Boost Python包装类?

时间:2013-02-04 11:50:32

标签: c++ boost boost-python

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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

根据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 :(得分:0)

我有一个类似的问题,但有一点不同:由于类导出定义在我自己的代码中,我能够更改首次调用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://stackoverflow.com/a/30622038/4184258