instance_holders является абстрактным базовым классом, чьи конкретные производные классы содержат C++ классовые экземпляры в своих обертках объектов Python. Чтобы разрешить множественное наследование на Python из оберток класса C ++, каждый такой объект Python содержит цепочку обладателей экземпляра. Когда используется функция __init__ для завернутого класса C++, в объекте Python создается и устанавливается новый экземпляр instance_holders с использованием функции install(). Каждый конкретный класс, полученный от instance_holders, должен обеспечить holds() реализация, которая позволяет увеличить. Python, чтобы запросить его для типа(ов), который он удерживает. Для того, чтобы поддержать завернутый конструктор(ы), класс также должен предоставить конструкторам, которые могут принять первоначальный PyObject* аргумент, касающийся владения объектом Python, и которые передают оставшуюся часть своих аргументов конструктору удерживаемого типа. Первоначальный аргумент необходим для того, чтобы виртуальная функция была переопределена на Python, и может быть проигнорирован, в зависимости от конкретного подкласса instance_holders.
Ниже приведена упрощенная версия шаблона держателя экземпляра, используемого Boost. Python для обертывания классов, удерживаемых умными указателями:
template<classSmartPtr,classValue>structpointer_holder:instance_holder{// construct from the SmartPtr typepointer_holder(SmartPtrp):m_p(p)// Forwarding constructors for the held typepointer_holder(PyObject*):m_p(newValue()){}template<classA0>pointer_holder(PyObject*,A0a0):m_p(newValue(a0)){}template<classA0,classA1>pointer_holder(PyObject*,A0a0,A1a1):m_p(newValue(a0,a1)){}...private:// required holder implementationvoid*holds(type_infodst_t){// holds an instance of the SmartPtr type...if(dst_t==python::type_id<SmartPtr>())return&this->m_p;// ...and an instance of the SmartPtr's element_type, if the// pointer is non-nullreturnpython::type_id<Value>()==dst_t?&*this->m_p:0;}private:// data membersSmartPtrm_p;};
Статья boost/python/instance_holder.hpp раздела Boost.Python Reference Manual Chapter 7. Utility and Infrastructure может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.