Cython与类的构造函数

2024-06-11 15:56:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我对默认构造函数的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包装,如下所示

^{pr2}$

Cython代码编译得很好,但特别是从Python调用时

from pyNode import pyNode as Node
n=Node(1.0,2.0)

我得到了预期的calling 2 args constructor字符串,但是如果我试图使用“no arguments”构造函数从python声明一个Node对象(应该正确地声明为__cinit__(self)),我没有得到任何输出,这意味着没有调用无参数构造函数!在

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


Tags: nonode声明argsvalthiscythonstd
1条回答
网友
1楼 · 发布于 2024-06-11 15:56:31

这里的问题是不能像这样重载__cinit__()(如only ^{} 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作为默认值:

^{pr2}$

相关问题 更多 >