Sie können einer Klasse mit einem Getter und einem Setter (in einem vereinfachten Fall) eine Eigenschaft hinzufügen:
%Vor%So können Sie es von Python wie folgt verwenden:
%Vor%Aber wie fügt man einem Modul selbst eine Eigenschaft hinzu (keine Klasse)?
Es gibt
%Vor%und
%Vor%Ich kann globale Funktionen und Objekte meiner Klasse hinzufügen, indem ich die obigen zwei Möglichkeiten benutze, aber ich kann scheinen, dass Eigenschaften nicht wie in Klassen hinzugefügt werden.
__getattr__
und __setattr__
werden nicht für Module aufgerufen, daher können Sie dies nicht tun in normalem Python ohne Hacks (wie das Speichern einer Klasse im Modulwörterbuch). Angesichts dessen ist es sehr unwahrscheinlich, dass es auch in Boost Python eine elegante Methode gibt.
boost.python / HowTo auf Python Wiki hat eine Beispiel für das Aussetzen eines C ++ - Objekts als Modulattribut in BOOST_PYTHON_MODULE
:
Um das Attribut außerhalb von BOOST_PYTHON_MODULE
zu setzen, verwenden Sie
Jetzt können Sie in Python etwas wie
tun %Vor% Natürlich müssen Sie die Klasse von my_cpp_object
im Voraus registrieren (z. B. können Sie dies innerhalb des gleichen BOOST_PYTHON_MODULE
-Aufrufs tun) und sicherstellen, dass die Lebensdauer des C ++ - Objekts die des Python-Moduls übersteigt. Sie können bp::object
anstelle von C ++ eins verwenden.
Beachten Sie, dass BOOST_PYTHON_MODULE
Ausnahmen verschluckt. Wenn Sie also einen Fehler machen, erhalten Sie keine Fehlermeldung, und BOOST_PYTHON_MODULE
-generated function kehrt sofort zurück. Um das Debuggen in diesem Fall zu erleichtern, können Sie Ausnahmen in BOOST_PYTHON_MODULE
abfangen oder temporär eine Logging-Anweisung als letzte Zeile von BOOST_PYTHON_MODULE
hinzufügen, um zu sehen, dass sie erreicht ist:
Tags und Links python c++ boost boost-python