Rozszerzam moją bibliotekę o Python (2.7), owijając interfejsy SWIG 2.0, i mam obiekt wykresu, w którym chcę utworzyć gościa. W C++ interfejs wygląda tak:Jak przekazać instancję Pythona do C++ za pośrednictwem Pythona/C API
struct Visitor
{
virtual void OnStateBegin() = 0;
virtual void OnNode(Node* n) = 0;
virtual void OnStateEnd() = 0;
};
chciałbym zdefiniować klasę w Pythonie, który robi równowartość, które zostały zdefiniowane w Pythonie, który pozwoli na definicji odwiedzającego:
class GraphVisitor:
def __init__(self, label):
self._label = label
print("__init__(self,{0})".format(self._label))
def OnStateBegin(self):
print("OnStateBegin()" + self._label)
def OnNode(self, i_node):
print("OnNode()" + self._label)
def OnStateEnd(self):
print("OnStateEnd()" + self._label)
Co próbuję zrobić, to utworzyć instancję GraphVisitora w skrypcie Pythona i wywołać metody OnStateBegin(), OnNode() i OnStateEnd() dla danej instancji z C++. Oto, co chciałbym robić w Pythonie:
#model is a SWIG wrapped class
mvis = GraphVisitor("This is a test")
model.Visit("mvis") # I'm not sure how to pass the instance 'mvis' to C++?
I w moim C++ owinięty przez Swig, nie jestem pewien, w jaki sposób dostać się na przykład „mvis”? Mogę wywoływać funkcje zdefiniowane w Pythonie bez problemu, ale instancje mnie zaskoczyły!
'mvis' to tylko przykład klasy Pythona. Ma to do czynienia z twoim 'struct Visitor'. W C/C++ można uzyskać do niego dostęp tylko jako 'PyObject *'. – Thomas
Wiem o tym. Próbowałem opisać, że próbuję zdefiniować odwiedzającego w Pythonie i to jest odpowiednik C++. –
Widziałeś moją poprzednią odpowiedź: http://stackoverflow.com/questions/9040669/how-can-i-implement-ac-class-in-python-to-be-called-by-c/9042139#9042139 (możesz pominąć bity dotyczące osadzania, ale bit o konwersję do interfejsu C++ z PyObject robi dokładnie to, co chcesz) – Flexo