Mam zdefiniowaną klasę Event
zdefiniowaną w C++, którą eksponuję w Pythonie za pomocą funkcji Boost. Oczekuje się, że moje skrypty wywodzą się z tej klasy i chciałbym zainicjować trochę, gdy zdefiniowana zostanie nowa klasa podrzędna.Ustawianie metaklasy zawiniętej klasy za pomocą Boost.Pythona
Jak ustawić metaklum wyeksponowanej klasy Event
tak, że kiedykolwiek skrypt Pythona wywodzi się z tej klasy, metaklasa może wykonać wymaganą inicjalizację?
chciałbym uniknąć konieczności jawnie użyć metaklasa w skryptach ...
class KeyboardEvent(Event): # This is what I want
pass
class KeyboardEvent(Event, metaclass=EventMeta): # This is not a good solution
pass
Edit:Część roztworu
Wydaje się nie ma mowy ustawić metaclass za pomocą Boost.Python. Następną najlepszą rzeczą jest improwizacja i zmiana metaclasu po zdefiniowaniu klasy. W rodzimej Pythonie the safe way zmienić metaklasa jest, aby to zrobić:
B = MetaClass(B.__name__, B.__bases__, B.__dict__)
W Boost że to wyglądać mniej więcej tak:
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__"]));
}
Problem polega na tym, że nie może wydawać się znaleźć sposób na zdefiniowanie metaclass za pomocą Boost.Python, dlatego otworzyłem How to define a Python metaclass with Boost.Python?.
Może "class EventWithMeta (Event, metaclass = EventMeta): pass' then' class KeyboardEvent (EventWithMeta); class AnotherEvent (EventWithMeta) '? – reclosedev
@reclosedev Nie. Problem polega na tym, że nie wpisuję słowa "metaclass". To, że potrzeba metaclass jest szczegółem implementacji, który nie powinien przeciekać do interfejsu narażonego na skrypty. –
Może brakuje mi czegoś, ale w tym przypadku 'Event' może być przemianowany na' _Event' lub coś podobnego, oraz 'EventWithMeta' na' Event'. – reclosedev