Cython:包装一个C ++类,它将自身的不同实例作为输入

时间:2017-07-23 14:53:46

标签: python c++ cython

我最近开始研究一个充满微积分操作的快速python库,它可以帮助我更好地学习AI背后的数学。我认为张量流的问题在于,一切都会发生,我会从实现它中学到很多东西:)

这个库中的主要类是Variable类,它有3种方法来初始化它 - 作为一个常量,自变量或函数。我想在cython中包装这个类。到目前为止,该类只有一个构造函数和一个getValue函数,它将返回一个给出类值的函数。

问题在于,当你将它初始化为一个函数时,构造函数需要另外两个Variable类的实例以及它们之间的操作(想法是稍后,我会将这些函数变量组合起来制作任何函数)。我想在cython中包装它: variable.pyx:

cdef extern from "Variable.h" namespace "calc":
cdef cppclass Variable:
    float value;
    Variable();
    Variable(float value);
    Variable(Variable a, Variable b, char op);
    float getValue();

cdef class _Variable:
    cdef Variable thisptr 
    def __cinit__(self):
        self.thisptr = Variable()
    def __cinit__(self, float x):
        self.thisptr = Variable(x)
    def __cinit__(self, Variable a, Variable b, char g):
        self.thisptr = Variable(a,b,g)
    def getValue(self):
        self.thisptr.getValue()

Variable.h:

namespace calc {
class Variable {
    public:
        float value;
        Variable();
        Variable(float value);
        Variable(Variable a, Variable b, char op);
        ~Variable();
        float getValue();
};
} 

和setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(ext_modules=[Extension("pyCalc", ["variable.pyx", "Variable.cpp"], language="c++",)],
  cmdclass = {'build_ext': build_ext})

令人惊讶的是,重载似乎工作正常,问题出现在这里 def __cinit __(self,Variable a,Variable b,char g):因为变量在python中不存在,只有_Variable才有。我无法通过_Variable,因为它在C ++中不存在。

你觉得我应该怎么做?如何在Python中传递另一个C ++类实例,它在技术上是一个不同的类,只使用C ++代码?

非常感谢!老实说,我不知道下一步该做什么:)

1 个答案:

答案 0 :(得分:1)

我认为这样做的标准方法是:

def __cinit__(self, _Variable a, _Variable b, char g):
    self.thisptr = Variable(a.thisptr,b.thisptr,g)

我现在手头没有安装cython而且不​​够熟练,以确保没有其他问题。试试吧!

稍微不同的说明:也许您声明构造函数的方式是有意的,但通常人们希望避免应对ab并使用引用调用:{{1}而不是像你一样按值调用。