Boost.Python 学习笔记 No.2——python操作c++对象

来源:互联网 发布:淘宝网下载2016新版 编辑:程序博客网 时间:2024/06/05 19:28

准备条件不赘述,看No.1


目标:将C++类通过dll导入到Python中使用


总结:

基本上还算顺利,不过构造函数那里是主要需要注意的地方,需要额外的写进一些东西。

如果没写的话是这种结果:


当时是用这段代码测试的:

#test.py

import ObjectTesthuman1 = ObjectTest.Human()human2 = ObjectTest.Human("KK", 100)print human1.age()print human1.name()human1.eat()human1.play()human1.setName("XX")print human1.name()human1.setAge(15)print human1.age()print '---------------'print human2.age()print human2.name()
C++那边是提供了默认构造参数。

即如果设定参数进行构造的话,会和python那边的构造参数列表不对应。

于是修改main.cpp,加上了init<string, int>(),结果用相同的test.py是报这种错误:


总之是默认构造参数没有生效的问题,所以可能在给python传递对象的不能使用默认构造参数。


测试代码:

C++ 

//main.cpp#include <boost/python.hpp>#include <string>#include "Human.h"using namespace boost::python;BOOST_PYTHON_MODULE(ObjectTest){class_<Human>("Human", init<std::string, int>()).def("eat",&Human::Eat).def("play",&Human::Play).def("setName",&Human::SetName).def("setAge",&Human::SetAge).def("name",&Human::name).def("age",&Human::age);}

//Human.h#pragma once#include <iostream>#include <string>using namespace std;class Human{public:Human(string name = "小M", int age = 22);~Human();void Eat();void Play();void SetName(string name);void SetAge(int age);//返回const引用的话编译会出错。const string name() const;const int age() const;private:string_name;int_age;};

//Human.cpp#include "Human.h"Human::Human(string name, int age):_name(name), _age(age){cout<<_name<<"诞生啦"<<endl;}Human::~Human(){cout<<_name<<"挂掉啦"<<endl;}void Human::Eat(){cout<<_name<<"在吃饭"<<endl;}void Human::Play(){cout<<_name<<"在玩..."<<endl;}void Human::SetName(string name){_name = name;}void Human::SetAge(int age){_age = age;}const string Human::name() const{return _name;}const int Human::age() const{return _age;}

Python

//test.pyimport ObjectTesthuman1 = ObjectTest.Human("KK", 100)print human1.age()print human1.name()human1.eat()human1.play()human1.setName("XX")print human1.name()human1.setAge(15)print human1.age()


效果:


原创粉丝点击