美文网首页
基于boost::python,Python中继承C++的类型并

基于boost::python,Python中继承C++的类型并

作者: 万士辰 | 来源:发表于2020-06-18 18:06 被阅读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()

    相关文章

      网友评论

          本文标题:基于boost::python,Python中继承C++的类型并

          本文链接:https://www.haomeiwen.com/subject/otxpxktx.html