Konstruktory klas Cython i c ++
Czy ktoś może zasugerować sposób manipulowania obiektami c ++ w Cythonie, gdy oczekuje się, że instancja c ++ jednej klasy będzie zasilać konstruktor innej opakowanej klasy, jak opisano poniżej?
Proszę spojrzeć na notatkę na pliku pyx dla klasy PySession, która pobiera obiekt Pythona PyConfigParams jako argument, a następnie musi wyodrębnić z niego wartości w celu skonstruowania obiektu C ++ ConfigParams. Obiekt ConfigParams jest następnie używany do zasilania konstruktora sesji.
Byłoby idealnie, gdybyśmy mieli procedurę, która pozwoliłaby mi „wstrzyknąć” obiekt c ++ ConfigParams owinięty przez obiekt PyConfigParams bezpośrednio do konstruktora sesji, bez konieczności demontażu go, a następnie budowania nowego obiektu c ++ do zasilania konstruktora. To oczywiście działa. Jest to jednak uciążliwy, brutalny sposób na wdrożenie tego rozwiązania, nie wspominając o niewiarygodnym.
Mam świadomość istnienia PyCapsule, jednak może to wymagać dotknięcia nagłówków c ++, czego nie mogę zrobić.
W związku z tym, ale inne pytanie brzmi: co będzie, jeśli potrzebuję klasy opakowanej (powiedzmy tutaj PySession) do symulacji zachowania api C ++ przez zwrócenie instancji ConfigParams? Czy musiałbym zrobić odwrotny i zdemontować obiekt c ++, aby zbudować Python PyConfigParams, który następnie zostałby zwrócony użytkownikowi Pythona w świecie Pythona? Wszelkie sugestie są bardzo mile widziane! Dziękuję Ci!
Załóżmy, że mam dwie klasy c ++ o nazwie ConfigParams i Session. Instancja ConfigParams jest używana do zasilania konstruktora klasy Session:
Klasy C ++Klasa ConfigParams<code>// ConfigParams.h #include <iostream> using namespace std; class ConfigParams { int parameter1; public: ConfigParams(int par1) { this->parameter1 = par1;} int getPar1() { return this->parameter1; } }; </code>Klasa sesji
<code>// Session.h #include <iostream> using namespace std; #include "configparams.h" class Session { int sessionX; public: Session(ConfigParams parameters) { this->sessionX = parameters.getPar1(); } void doSomething(); }; void Session::doSomething() { cout << "Session parameters set as: " << endl; cout << "X = " << this->sessionX << endl; } </code>Pliki Cython pyx i pxd dla powyższych klas:PyConfigParams
<code># configparams.pxd cdef extern from "configparams.h": cppclass ConfigParams: ConfigParams(int par1) int getPar1() # configparams.pyx cdef class PyConfigParams: cdef ConfigParams* thisptr def __cinit__(self, i): self.thisptr = new ConfigParams(<int> i) def getPar1(self): return self.thisptr.getPar1() </code>Klasa PySession
<code># session.pxd from configparams cimport * cdef extern from "session.h": cdef cppclass Session: Session(ConfigParams parameters) void doSomething() # session.pyx cdef class PySession: cdef Session* thisptr def __cinit__(self, pars): # Note that here I have to extract the values # from the pars (python PyConfigParams object) # in order to build a c++ ConfigParams object # which feeds the c ++ constructor of Session. cdef ConfigParams* cpppargsptr = new ConfigParams(<int> pars.getPar1()) self.thisptr = new Session(cpppargsptr[0]) def doSomething(self): self.thisptr.doSomething() </code>