我在使用默认构造函数的Cython时遇到问题。
我的C ++类节点如下
Node.h
class Node
{
public:
Node()
{
std::cerr << "calling no arg constructor" << std::endl;
w=0.0;
d=0.0;
}
Node(double val, double val2);
{
std::cerr << "calling 2 args constructor" << std::endl;
this->w=val;
this->d=val2;
}
private:
double d,w;
}
包含在Cython中,如下所示
cdef extern from "Node.h":
cdef cppclass Node:
Node() except +
Node(double val1, double val2) except +
double d
double w
cdef class pyNode:
cdef Node *thisptr # hold a C++ instance which we're wrapping
def __cinit__(self):
self.thisptr = new Node()
def __cinit__(self, double val1, double val2):
self.thisptr = new Node(val1,val2)
def __dealloc__(self):
del self.thisptr
def __repr__(self):
return "d=%s w=%s" % (self.thisptr.w, self.thisptr.w )
Cython代码编译得很好,但特别是从Python调用时
from pyNode import pyNode as Node
n=Node(1.0,2.0)
我得到了预期的calling 2 args constructor
字符串,但是如果我试图使用“无参数”构造函数从python声明一个Node对象(应该正确地声明为__cinit__(self)
我是没有输出,这意味着没有调用无参数构造函数!
如何从包装类的 cinit 方法中明确调用它?
答案 0 :(得分:7)
这里的问题是你不能像那样重载__cinit__()
(如only cdef
functions can be overloaded) - 而是让它采用默认值,然后根据需要调用正确的东西。
编辑:基本上,您需要以更接近普通Python代码的方式实现该函数,而不是使用重载:
def __cinit__(self, double val1=-1, double val2=-1):
if val1 == -1 or val2 == -1:
self.thisptr = new Node()
else:
self.thisptr = new Node(val1,val2)
当然,这假设-1
是一个对函数无用的值,你可以使用另一个值,或者如果你需要double的每个值都有效,那么你可能需要删除输入,获取Python对象,以便您可以使用None
作为默认值:
def __cinit__(self, val1=None, val2=None):
if val1 is not None and val2 is not None:
self.thisptr = new Node(val1, val2)
else:
self.thisptr = new Node()