基于boost::python,Python中继承C++的类型并
2020-06-18 本文已影响0人
万士辰
官方文档的Wrapper建议
C++代码:
class TestBase
{
public:
virtual void f()
{
cout<<"cpp: call TestBase f"<<endl;
}
};
class TestBaseWrapper : public TestBase, public wrapper<TestBase>
{
public:
void f() override
{
cout << "cpp: call TestBaseWrapper f" << endl;
if (auto f = this->get_override("f"))
{
f();
return;
}
this->TestBase::f();
}
void default_f()
{
cout << "cpp: call TestBaseWrapper default_f" << endl;
this->TestBase::f();
}
};
class_<TestBaseWrapper, boost::noncopyable>("TestBase", init<>())
.def("f", &TestBase::f, &TestBaseWrapper::default_f)
;
python 调用
Python测试代码:
TestBase().f()
cpp: call TestBaseWrapper default_f
cpp: call TestBase f
class TestPySub1(TestBase):
pass
TestPySub1().f()
cpp: call TestBaseWrapper default_f
cpp: call TestBase f
class TestPySub2(TestBase):
def f(self):
print "py: call TestPySub2 f"
TestPySub2().f()
py: call TestPySub2 f
结论:
从python层调用 f()
未覆写方法 -> TestBaseWrapper::default_f()
已覆写 -> py覆写的 f()
C++ 调用
C++代码:
void test(TestBase* obj)
{
obj->f();
}
def("test", &test);
Python测试代码:
test(TestBase())
cpp: call TestBaseWrapper f
cpp: call TestBase f
class TestPySub1(TestBase):
pass
test(TestPySub1())
cpp: call TestBaseWrapper f
cpp: call TestBase f
class TestPySub2(TestBase):
def f(self):
print "py: call TestPySub2 f"
test(TestPySub2())
cpp: call TestBaseWrapper f
py: call TestPySub2 f
结论:
从C++层调用 f()
调用TestBaseWrapper::f()
未覆写方法 -> TestBase::f()
已覆写 -> py覆写的 f()
尝试简化
C++代码:
class TestBase :public wrapper<TestBase>
{
public:
virtual void f()
{
cout<<"cpp: call TestBase f"<<endl;
}
void f_()
{
cout << "cpp: call TestBase f_" << endl;
if (auto f = this->get_override("f"))
{
f();
return;
}
this->f();
}
};
class_<TestBase, boost::noncopyable>("TestBase", init<>())
.def("f", &TestBase::f)
;
Python 调用
Python测试代码
TestBase().f()
cpp: call TestBase f
class TestPySub1(TestBase):
pass
TestPySub1().f()
cpp: call TestBase f
class TestPySub2(TestBase):
def f(self):
print "py: call TestPySub2 f"
TestPySub2().f()
py: call TestPySub2 f
结论:
从python层调用 f()
未覆写方法 -> TestBase::f()
已覆写 -> py覆写的 f()
C++ 调用
C++代码:
void test(TestBase* obj)
{
obj->f_();
}
def("test", &test);
Python测试代码:
test(TestBase())
cpp: call TestBase f_
cpp: call TestBase f
class TestPySub1(TestBase):
pass
test(TestPySub1())
cpp: call TestBase f_
cpp: call TestBase f
class TestPySub2(TestBase):
def f(self):
print "py: call TestPySub2 f"
test(TestPySub2())
cpp: call TestBase f_
py: call TestPySub2 f
结论:
从C++层调用 f()
调用TestBase::f_()
未覆写方法 -> TestBase::f()
已覆写 -> py覆写的 f()