gpt4 book ai didi

c++ - Cython 和类的构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:09 26 4
gpt4 key购买 nike

我对默认构造函数的 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字符串,但是如果我尝试使用“无参数”构造函数(应该正确声明为 __cinit__(self))从 python 声明一个 Node 对象,我没有得到任何输出,这意味着无参数构造函数不是叫!

如何从包装类的 cinit 方法显式调用它?

最佳答案

这里的问题是你不能像那样重载 __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()

关于c++ - Cython 和类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com