Python中的类成员函数必须显式声明一个表示类实例的self
参数。有没有办法通过使用Boost从C ++中获取self
?
class FooBar
{
public:
void func() {
}
};
// A wrapper for the above class
struct FooBar_W
: public FooBar
{
void func(boost::python::object self) {
// Do smth with `self`
FooBar::func();
}
};
BOOST_PYTHON_WRAPPER(module)
{
class_<FooBar_W>("FooBar")
.def("func", &FooBar_W::func)
;
}
修改:为什么我需要self
我正在为我的游戏编写一个事件系统,我希望脚本编写者能够定义新类型的事件。我需要一种方法来区分不同类型的事件。我的Python代码看起来像这样:
class KeyboardEvent(Event):
pass
def onKeyPress(event):
pass
# EventManager is defined in C++
em = EventManager()
# This is how I register a new callback function with the manager
# The `onKeyPress` function will now only be notified when an event
# of type `KeyboardEvent` occurs. (Notice that I passed the actual
# class object, and not an instance of it.)
em.addEventHandler(KeyboardEvent, onKeyPress)
# This is how I queue new events
# (This time I pass an instance of an event, not a type of event.)
em.queueEvent(KeyboardEvent())
经理需要弄清楚我刚刚排队的事件类型。我想我应该做类似type(event).__name__
的事情(但在C ++中,而不是在Python中)。这样我就可以确定类型并知道要通知事件的函数。我希望在C ++中获得self
,以便我可以访问其类型的__name__
属性。
我可以让脚本编写者手动编辑一个包含该类型名称的新字段,但为什么呢?该信息已经存在(__name__
属性)所以为什么要重复它,但更重要的是,为什么要为脚本编写者提供实现细节呢?
答案 0 :(得分:2)
这是可行的。可以在下面的链接中找到这样做的方法;该页面以一种方式(旧方式)文档来公开纯虚函数。不过,这个例子可以适应其他需求 &GT; http://wiki.python.org/moin/boost.python/OverridableVirtualFunctions#Pure_Virtual_Functions
答案 1 :(得分:2)
这是一个老问题,但对于那些仍在寻找一个相当简单的解决方案的人来说:
静态函数(非成员以及成员)接收const boost::python::object& self
作为第一个参数。所以你可以做到以下几点:
class FooBar
{
public:
static void func(const boost::python::object self) {
FooBar& thisref = boost::python::extract<FooBar&>(self)();
// use self as well as thisref
}
};
};
BOOST_PYTHON_WRAPPER(module)
{
class_<FooBar>("FooBar")
.def("func", &FooBar::func)
;
}
答案 2 :(得分:0)
self
在C ++中是this
。
您可以将行FooBar::func();
视为转换为static_cast<FooBar*>(this)->func()