Сам напросился БАТАН)
С начала создаём заголовочный файл C++ (Да простят меня C++-шники:-))
Person.hpp
#ifndef PERSON_H
#define PERSON_H
#include <string>
using namespace std;
namespace person{
class CppPerson{
public:
string name;
int age;
CppPerson();
CppPerson(const string &name, const int &age);
~CppPerson();
void setName(const string &name);
string getName();
int getAge();
};
}
#endif
Далее реализация
Person.cpp
#include <string>
#include "Person.hpp"
namespace person{
CppPerson::CppPerson(){}
CppPerson::CppPerson(const string &name, const int &age){
this->name = name;
this->age = age;
}
CppPerson::~CppPerson(){}
void CppPerson::setName(const string &name){
this->name = name;
}
string CppPerson::getName(){
return name;
}
int CppPerson::getAge(){
return age;
}
}
Далее в дело вступает как раз таки Cython
person_module.pyx
from libcpp.string cimport string
cdef extern from "Person.hpp" namespace "person":
cdef cppclass CppPerson:
CppPerson(string name, int age) except +
void setName(string name)
string getName()
int getAge()
cdef class Person:
cdef CppPerson *cpp_person
def __cinit__(self, name, age):
self.cpp_person = new CppPerson(name.encode(), age)
if self.cpp_person == NULL:
raise MemoryError('Not enough memory.')
def __dealloc__(self):
del self.cpp_person
def setName(self, name):
self.cpp_person.setName(name.encode())
def getName(self):
return self.cpp_person.getName().decode()
def getAge(self):
return self.cpp_person.getAge()
Далее
setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(ext_modules = cythonize(Extension(
"person_module", # the extesion name
sources=["person_module.pyx", "Person.cpp"], # the Cython source and
# additional C++ source files
language="c++", # generate and compile C++ code
)))
Теперь нужно всё это чудо скормить Cython-у
В той же папке где находятся все эти файлы запускаем cmd (Или с начала запускаем cmd а потом
переходим в эту директорию)
В cmd прописываем
python setup.py build_ext --inplace
Ну и тест
test.py
from person_module import Person
def main():
alexandr = Person("Александр", 35)
print(alexandr.getName())
print(alexandr.getAge())
if __name__ == '__main__':
main()
Документация о Cython