准备条件不赘述,看No.1
目标:将C++类通过dll导入到Python中使用
总结:
基本上还算顺利,不过构造函数那里是主要需要注意的地方,需要额外的写进一些东西。
如果没写的话是这种结果:
当时是用这段代码测试的:
#test.py
import ObjectTest
human1 = 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.py
import ObjectTest
human1 = 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()
效果: