Ho una classe Event
definita in C++ che espongo in Python utilizzando Boost. I miei script dovrebbero derivare da questa classe, e mi piacerebbe fare qualche inizializzazione ogni volta che viene definita una nuova classe figlia.Impostazione metaclasse di classe wrapping con Boost.Python
Come posso impostare il metaclasse della classe esposta Event
in modo tale che ogni volta che uno script Python deriva da questa classe, il metaclass potrebbe eseguire l'inizializzazione richiesta?
Vorrei evitare di dover utilizzare in modo esplicito un metaclasse negli script ...
class KeyboardEvent(Event): # This is what I want
pass
class KeyboardEvent(Event, metaclass=EventMeta): # This is not a good solution
pass
Edit:Parte della soluzione
Sembra che ci sia alcun modo per impostare il metaclass con Boost.Python. La prossima cosa migliore è improvvisare e cambiare il metaclasse dopo che la classe è stata definita. In Python nativo, the safe way per cambiare un metaclasse è quello di fare questo:
B = MetaClass(B.__name__, B.__bases__, B.__dict__)
In Boost, che sarebbe sembrare qualcosa di simile:
BOOST_PYTHON_MODULE(event)
{
using namespace boost::python;
using boost::python::objects::add_to_namespace;
class_<EventMetaClass> eventmeta("__EventMetaClass")
...;
class_<Event> event("Event")
...;
add_to_namespace(scope(), "Event",
eventmeta(event["__name__"], event["__bases__"], event["__dict__"]));
}
Il problema è che io non riesco a trovare un modo per definire un metaclasse con Boost.Python, che è il motivo per cui ho aperto How to define a Python metaclass with Boost.Python?.
Forse 'class EventWithMeta (Event, metaclass = EventMeta): pass' then' class KeyboardEvent (EventWithMeta); class AnotherEvent (EventWithMeta) '? – reclosedev
@reclosedev No. Il problema non sono io che digito la parola "metaclass". È che la necessità di un metaclasse è un dettaglio di implementazione che non dovrebbe perdere l'interfaccia esposta agli script. –
Forse mi manca qualcosa, ma in questo caso 'Event' può essere rinominato in' _Event' o qualcosa di simile, e 'EventWithMeta' in' Event'. – reclosedev