Python 用于声明具有别名的类层次结构的Cython语法

Python 用于声明具有别名的类层次结构的Cython语法,python,c++,cython,Python,C++,Cython,下面是一个抽象基类和一个具体的子类,我想通过Cython将其公开给Python: class NodeDistance { protected: const Graph& G; public: NodeDistance(const Graph& G); virtual ~NodeDistance(); virtual void preprocess() = 0; virtual double distance(node u, node

下面是一个抽象基类和一个具体的子类,我想通过Cython将其公开给Python:

class NodeDistance {

protected:
    const Graph& G;

public:
    NodeDistance(const Graph& G);
    virtual ~NodeDistance();
    virtual void preprocess() = 0;
    virtual double distance(node u, node v) = 0;
};


class NeighborhoodDistance: public NetworKit::NodeDistance {

public:
    NeighborhoodDistance(const Graph& G);
    virtual ~NeighborhoodDistance();
    virtual void preprocess();
    virtual double distance(node u, node v);
};
这是我第一次尝试为Cython声明类的接口。为了避免
cppclass
es和Python包装类之间的命名冲突,我将每个
Class
声明为
\u Class
,后跟其正确名称
“Namespace::Class”

但是现在,当我试图表示
\u neighborhood distance
\u nodeInstance
的子类时,出现了一个语法错误。我做错了什么

Error compiling Cython file:
------------------------------------------------------------
...
        void preprocess() except +
        double distance(node, node) except +


cdef extern from "../cpp/distmeasures/NeighborhoodDistance.h":
    cdef cppclass _NeighborhoodDistance(_NodeDistance) "NetworKit::NeighborhoodDistance":
                                                   ^
------------------------------------------------------------

_NetworKit.pyx:1698:52: Syntax error in C++ class definition

我认为你甚至不能在Cython0.20.1中表达基类和重命名的组合。您既可以不重命名类,也可以在
cdef extern from
中指定命名空间:

# C++ classes shown at the end
cdef extern from "example.hpp" namespace "example":
    cdef cppclass Base:
        void some_method() except +

    cdef cppclass Derived(Base):
        void some_method() except +
。。。或者不指定继承:

cdef extern from "example.hpp" namespace "example":
    cdef cppclass Base "example::Base":
        void some_method() except +

    cdef cppclass Derived "example::Derived":
        void some_method() except +

无论哪种方式,Cython似乎都不完全理解C++继承,需要一个明确的强制转换:

def test():
    cdef Derived d
    cdef Base *p = <Base *>&d
    p.some_method()
def test():
cdef导出的d
cdef基准*p=&d
p、 一些方法()

这很难看,因为在C++中,CAST有效地关闭了类型检查,但是小心使用它可以安全使用。(在其他情况下,Cython的类型检查需要C/C++中不需要的强制转换,这是非常不幸的。)

以下是我使用的类供参考:

// example.hpp
#include <cstdio>

namespace example {
    struct Base {
        virtual void some_method() = 0;
        virtual ~Base() = 0;
    };

    struct Derived {
        virtual void some_method()
        {
            std::puts("Hello!");
        }
        ~Derived()
        {
        }
    };
}
//example.hpp
#包括
名称空间示例{
结构基{
虚空某些_方法()=0;
virtual~Base()=0;
};
结构派生{
虚空法()
{
std::puts(“你好!”);
}
~Derived()
{
}
};
}

感谢您的澄清。很遗憾,Cython实际上不支持继承、多态性和诸如此类的好东西。
// example.hpp
#include <cstdio>

namespace example {
    struct Base {
        virtual void some_method() = 0;
        virtual ~Base() = 0;
    };

    struct Derived {
        virtual void some_method()
        {
            std::puts("Hello!");
        }
        ~Derived()
        {
        }
    };
}