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>

questionAnswers(1)

yourAnswerToTheQuestion