Установка метакласса завернутого класса с помощью Boost.Python

У меня есть класс 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? ,

One Solution collect form web for “Установка метакласса завернутого класса с помощью Boost.Python”

Если boost не предлагает способ сделать это с помощью cn c ++, и похоже, что этого не происходит, путь к созданию классов-оболочек, реализующих метакласс –

Это можно сделать более или менее автоматически присвоить кучу интроспекции. Предположим, что ваш модуль boost называется «событие» – вы должны либо назвать файл как _event, либо поместить его внутри своего модуля, и написать файл python с именем «event.py» (или файл __init__.py на вашем модуле, который более или менее:

 import _event class eventmeta(type): ... event_dict = globals() for key, value in _event.__dict__.items(): if isinstance(value, type): event_dict[key] = eventmeta(key, (value,),{}) else: #set other module members as members of this module event_dict[key] = value del key, value, event_dict 

Thos cpde автоматически устанавливает переменные модуля равными любым именам, найденным в собственном модуле «_event», и для каждого класса, с которым он сталкивается, создайте новый класс, изменяющий метакласс, как в вашем примере.

Возможно, вы получаете конфликт метакласса, делая это. Если это так, то нужно сделать, чтобы вновь созданные классы были прокси-серверами для родных классов, создав правильные __getattribute__ и __setattr__ . Просто спросите в комментарии, если вам это нужно.

Python - лучший язык программирования в мире.