2017-01-23 2 views
1

Ich habe eine Singleton-Klasse in C++ (kein öffentlicher Konstruktor, C++ - Programmierer rufen class.instance() auf, um den Singleton zu erstellen oder den vorhandenen zurückzugeben).Wie wickelt man eine Singleton-Klasse mit pybind11?

Ich würde es vorziehen, dies auf der Python-Ebene zu verstecken. Wenn ich einen Python Singleton schreiben würde, würde ich das in __new__ behandeln. Wenn eine Klasse keinen öffentlichen Konstruktor hat, glaube ich nicht, dass ich einen __init__ Wrapper erstellen kann (meine Versuche sind fehlgeschlagen). Ich sah keine Erwähnung von __new__ in der Pydbind11 Docs (obwohl es möglicherweise verpasst haben, und Google scheint glücklich zu sein, unterstreicht eine Rückkehr Seiten mit "neuen", ohne Erwähnung von __new__).

Gibt es ein Singleton Rezept für pybind11 (oder sogar Boost.Python)?

Antwort

0

Ich bin nicht sicher über pybind11, aber ich glaube, es sollte möglich sein, Ihre Klasse mit Boost.Python zu wickeln. (Ihre Frage lautet "oder sogar Boost.Python" ...)

Verwenden noncopyable und/oder no_init:

class_<Klass, boost::noncopyable>("Klass", no_init) 
    .staticmethod("instance") 
    ; 

https://mail.python.org/pipermail/cplusplus-sig/2004-March/006647.html

1

Sie brauchen nicht __init__ aussetzen, wenn Sie don‘ t instanziieren Sie Ihre Klasse von Python. Wie für Ihre Frage können Sie etwas wie dieses versuchen:

py::class_<CppSingle>(mod, "Single") 
.def_static("__new__", [](py:object) { return CppSingle::instance();)}, 
py::return_value_policy::reference_internal); 
Verwandte Themen