Установка метакласса завернутого класса с помощью 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? ,

  • Как работает класс Meta Django?
  • Django: ошибка при вызове базы метакласса
  • Свойства модуля документа Sphinx
  • Подклассовые модели django со встроенными запросами
  • Не следует ли __metaclass__ принудительно использовать метакласс в Python?
  • Как автоматически регистрировать класс при его определении
  • Кто звонит в метакласс
  • Есть ли причина выбирать __new__ над __init__ при определении метакласса?
  • 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__ . Просто спросите в комментарии, если вам это нужно.

    Interesting Posts

    Python: пытаюсь высмеять datetime.date.today (), но не работает

    Невозможно загрузить видеопотоки с помощью API-интерфейса youtube v3 в python

    Как сделать углы в полярном графике matplotlib идти по часовой стрелке с 0 ° вверху?

    Как разместить и выровнять легенду фигуры matplotlib?

    Как хранить данные настольных приложений в кросс-платформенном режиме для python?

    Как декодировать цветовое сопоставление в Colormap Matplotlib?

    matplotlib: соотношение сторон в подзаголовках с различными y-осями

    Python ConfigParser не может правильно искать файл .ini (Ubuntu 14, Python 3.4)

    отправка кода из vim в stata

    Безопасное хранение паролей для использования в скрипте python

    Python: можно вызвать статический метод из класса без указания имени

    Выпуск синтаксического анализа страницы xhtml с использованием Python

    Как вы получите следующее значение в последовательности с плавающей точкой?

    Как заставить matplotlib открывать окно для комментариев пользователей?

    Невозможно десериализовать RDD с различным количеством элементов в паре

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