У меня есть класс Event
, определенный в C ++, который я открываю для Python, используя Boost.Ожидается, что мои сценарии будут производными от этого класса, и я хотел бы выполнить некоторую инициализацию при каждом определении нового дочернего класса.
Как я могу установить метакласс открытого класса Event
таким образом, чтобы всякий раз, когдаСценарий Python является производным от этого класса, метакласс может выполнить необходимую инициализацию?
Я хотел бы избежать необходимости явно использовать метакласс в сценариях ...
class KeyboardEvent(Event): # This is what I want
pass
class KeyboardEvent(Event, metaclass=EventMeta): # This is not a good solution
pass
Редактировать: Часть решения
Кажется, нет способа установить метакласс с помощью Boost.Python.Следующая лучшая вещь - импровизировать и изменять метакласс после определения класса.В нативном Python безопасный способ изменить метакласс заключается в следующем:
B = MetaClass(B.__name__, B.__bases__, B.__dict__)
В Boost это будет выглядеть примерно так:
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__"]));
}
Проблема в том, что я не могу найти способ определить метакласс с Boost.Python, поэтому я открыл Как определить метакласс Python с Boost.Python? .