2016-03-28 3 views
1

In Cython ist eine Klasse oder ein Erweiterungstyp eine Python-Klasse, was bedeutet, dass sie von Python initialisiert werden kann. Auf der anderen Seite müssen die Parameter seiner __init__ oder __cinit__ Python-Objekt sein.Ist es möglich, "reine" C++ - Klasse in Cython zu schreiben?

Ist es möglich, eine Klasse in Cython zu schreiben, die nur von cdef-Funktionen initialisiert werden kann und somit von C-Typen und C++ - Objekten initialisiert werden kann?

Ich möchte dies, weil es einfacher wäre, meine vorhandenen Python-Codes in Cython-Code als C/C++ - Code zu übersetzen.

+1

Ich fand es möglich, C++ - Klasse von Cdef Cppclass schreiben. Viele C++ - Funktionen wie die Destruktorfunktion, der Überladungskonstruktor werden jedoch nicht unterstützt. Vielleicht werden sie in zukünftigen Versionen unterstützt? – iuradz

Antwort

0

Sie können ganz einfach eine Klasse erstellen, die nicht können (leicht) von Python initialisiert werden, kann aber nur von einer cdef Fabrik Funktion

cdef class ExampleNoPyInit: 
    cdef int value 

    def __init__(self): 
     raise RuntimeError("Cannot be initialise from python") 

cdef ExampleNoPyInit_factory(int v): 
    cdef ExampleNoPyInit a 

    # bypass __init__ 
    a = ExampleNoPyInit.__new__(ExampleNoPyInit) 
    a.value = v 
    return a 

inst = ExampleNoPyInit_factory(5) 

(Ich vermute, verpflichtete sich die wirklich erstellt werden, um die gleiche verwenden Es gibt andere Möglichkeiten, die Initialisierung zu verhindern, wenn Sie gründlicher vorgehen möchten - zum Beispiel könnten Sie eine globale Variable cdef in Ihrem Cython-Modul als Flag verwenden, auf die von Python aus nicht zugegriffen werden würde. .

Diese Klasse hat immer noch den Python-Referenzzählmechanismus eingebaut, ist also immer noch eine "Python-Klasse". Wenn Sie das vermeiden möchten, könnten Sie eine cdef struct verwenden (obwohl das Memberfunktionen nicht haben kann).