Abstrakte Klassen (mit rein virtuellen Methoden) in Cython

9

Schnellversion: Wie deklariert man eine abstrakte Klasse in Cython? Das Ziel ist, nur die Schnittstelle zu deklarieren, so dass andere Klassen von ihr erben können, es muss keine Implementierung dieser Klasse geben.

interface.pxd:

%Vor%

impl.pyx:

%Vor%

Alles kompiliert schön , aber wenn ich impl.so in Python importiere, bekomme ich folgendes:

%Vor%

Anscheinend war die Methode nicht wirklich virtuell und Python will IModel 's Instanz

Weitere Details:

Ich habe eine Cython-Erweiterungsklasse ( cdef class Integrator ), die für jede Instanz funktionieren sollte und die IModel -Schnittstelle implementiert. Die Schnittstelle stellt lediglich sicher, dass die Instanz eine Methode void get_dx(double[:] x, double[:] dx) hat, so dass der Integrator sie bei jedem Integrationsschritt aufrufen kann, um das Modell zu integrieren. Die Idee ist, dass man verschiedene Modelle in Cython implementieren und dann interaktiv integrieren und die Ergebnisse in python Skripten darstellen kann. So:

%Vor%

Die Klasse lorenz.pyx sollte ungefähr wie folgt aussehen:

%Vor%

Und die integrator.pyx :

%Vor%

Idealerweise sollte IModel only in Form einer Klassendefinition in einer Cython-Header -Datei (dh imodel.pxd) existieren, aber bisher konnte ich nur das erreichen gewünschte Funktionalität durch Schreiben einer hässlichen Dummy-Implementierungsklasse in imodel.pyx . Das Schlimmste ist, dass diese nutzlose Dummy-Implementierung kompiliert und verknüpft werden muss, damit andere Cython-Klassen davon erben können.

PS: Ich denke, das ist ein perfekter Anwendungsfall für abstrakte Klassen, aber wenn es dir schlecht aussieht, liebe OOP-Programmierer, sag mir bitte, welchen anderen Ansatz ich verwenden soll.

    
dmytro 20.12.2012, 16:48
quelle

2 Antworten

4

Es stellt sich heraus, dass dies nicht ganz möglich ist ( Diskussion ) . Derzeit werden Schnittstellen nicht unterstützt, offenbar weil sie keine kritische Bedeutung haben: Die übliche Vererbung funktioniert ziemlich gut.

    
dmytro 24.12.2012, 00:20
quelle
0

Wie deklariert man eine abstrakte Klasse in C ++? deklarieren normale Klasse, aber diese Klasse muss mindestens 1 rein virtuelle Funktion haben.     ex: Klasse abc {     virtual void show () = 0 // rein virtual funcn.no defn überhaupt     }

    
Arpit 22.12.2012 08:38
quelle

Tags und Links