我最近开始研究一个充满微积分操作的快速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 ++代码?非常感谢!老实说,我不知道下一步该做什么:)
答案 0 :(得分:1)
我认为这样做的标准方法是:
def __cinit__(self, _Variable a, _Variable b, char g):
self.thisptr = Variable(a.thisptr,b.thisptr,g)
我现在手头没有安装cython而且不够熟练,以确保没有其他问题。试试吧!
稍微不同的说明:也许您声明构造函数的方式是有意的,但通常人们希望避免应对a
和b
并使用引用调用:{{1}而不是像你一样按值调用。