![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Chapter 2. High Level ComponentsBoost , Boost.Python Reference Manual , Boost.Python Reference Manual
|
Параметр шаблона |
Требования |
Семантика |
по умолчанию |
---|---|---|---|
< |
Тип класса. |
Завернутый класс |
|
Базы |
Специализацияоснований<...>, которая определяет ранее открытые базовые классы C++< |
Регистрирует< |
|
HeldType |
Должен быть< |
Указывает тип, который фактически встроен в объект Python, обертывающий< |
< |
Некопируемый |
В случае поставки должно быть< |
Подавляет автоматическую регистрацию< |
Неуказанный тип, кроме бустера::некопируемый. |
T
>, его открытый конструктор(ы) должен принять первоначальный аргумент<PyObject*
>, который ссылается на объект Python, который содержит экземпляр HeldType, как показано в этом примере. Этот аргумент не включен вinit-выражение, переданноеdef (init_expr), ниже, и не передается явно пользователями, когда создаются экземпляры Python<T
>. Эта идиома позволяет виртуальным функциям C++, которые будут переопределены в Python, получить доступ к объекту Python, чтобы можно было использовать метод Python. Повышаю. Python автоматически регистрирует дополнительные преобразователи, которые позволяют передавать завернутые экземпляры<T
>для завернутых функций C++, ожидающих аргументов HeldType.T
>вместо аргументов HeldType, указывая умный указатель для HeldType, что позволяет пользователям передавать экземпляры Python<T
>, где ожидается умный указатель на T. Умные указатели, такие как<std::auto_ptr<>
>или<boost::shared_ptr<>
>, которые содержат вложенный тип<element_type
>, обозначающий референтный тип, поддерживаются автоматически; дополнительные умные указатели могут поддерживаться специализацией<pointee<HeldType>
>.T
>, первоначальный аргумент<PyObject*
>должен быть предоставлен всеми открытыми конструкторами HeldType.PyObject*
>, специализируясь наимеет_back_referencenamespace boost { namespace python { template <class T , class Bases = bases<> , class HeldType = T , class NonCopyable = unspecified > class class_ : public object { // Constructors with default __init__ class_(char const* name); class_(char const* name, char const* docstring); // Constructors, specifying non-default __init__ template <class Init> class_(char const* name, Init); template <class Init> class_(char const* name, char const* docstring, Init); // Exposing additional __init__ functions template <class Init> class_& def(Init); // defining methods template <class F> class_& def(char const* name, F f); template <class Fn, class A1> class_& def(char const* name, Fn fn, A1 const&); template <class Fn, class A1, class A2> class_& def(char const* name, Fn fn, A1 const&, A2 const&); template <class Fn, class A1, class A2, class A3> class_& def(char const* name, Fn fn, A1 const&, A2 const&, A3 const&); // declaring method as static class_& staticmethod(char const* name); // exposing operators template <unspecified> class_& def(detail::operator_<unspecified>); // Raw attribute modification template <class U> class_& setattr(char const* name, U const&); // exposing data members template <class D> class_& def_readonly(char const* name, D T::*pm); template <class D> class_& def_readwrite(char const* name, D T::*pm); // exposing static data members template <class D> class_& def_readonly(char const* name, D const& d); template <class D> class_& def_readwrite(char const* name, D& d); // property creation template <class Get> void add_property(char const* name, Get const& fget, char const* doc=0); template <class Get, class Set> void add_property( char const* name, Get const& fget, Set const& fset, char const* doc=0); template <class Get> void add_static_property(char const* name, Get const& fget); template <class Get, class Set> void add_static_property(char const* name, Get const& fget, Set const& fset); // pickle support template <typename PickleSuite> self& def_pickle(PickleSuite const&); self& enable_pickling(); }; }}
class_(char const* name); class_(char const* name, char const* docstring); template <class Init> class_(char const* name, Init init_spec); template <class Init> class_(char const* name, char const* docstring, Init init_spec);
Имяntbs, которое соответствует правилам именования идентификаторов Python. Если докстринг поставляется, он должен бытьntbs. Если<init_spec
>подается, то это должна быть либо специальная постоянная перечисления<no_init
>, либоinit-выражение, совместимое с<T
>.
Построение объекта<class_
>с поднятием. Класс расширений Python с именем. Названный атрибуттекущего объемасвязан с новым классом расширения.
__doc__
>атрибуту класса расширения.init_spec
>является<no_init
>, генерируется специальная<__init__
>функция, которая всегда вызывает исключение Python. В противном случае<this->def(init_spec)
>называется.init_spec
>не подается,<this->def(init<>())
>вызывается.Позволяя пользователю указать аргументы конструктора в<class_<>
>конструктор помогает ей избежать распространенных ошибок времени выполнения, которые возникают в результате вызова обернутых функций-членов без раскрытия функции<__init__
>, которая создает необходимый экземпляр<T
>. Типы, которые не могут быть построены по умолчанию, вызовут ошибку времени компиляции, если не поставляется<Init
>. Пользователь должен всегда предоставлять имя, так как в настоящее время не существует портативного способа получения текста имени класса из его типа.
template <class Init> class_& def(Init init_expr);
<init_expr
>является результатомinit-выражения, совместимого с<T
>.
Для каждогодействительного префикса<P
>из<Init
>добавляется<__init__(...)
>перегрузка функции в класс расширения, принимающий P в качестве аргументов. Каждая сгенерированная перегрузка создает объект HeldType в соответствии с описанной выше семантикой, используя копию политики вызова init_expr. Если самый длинныйдействительный префиксInit содержит N типов и init_expr содержит M ключевых слов, начальная последовательность ключевых слов используется для всех, кроме первых N - M аргументов каждой перегрузки.
<*this
>
Позволяет пользователям легко представить конструктор класса на Python.
template <class F> class_& def(char const* name, Fn fn); template <class Fn, class A1> class_& def(char const* name, Fn fn, A1 const& a1); template <class Fn, class A1, class A2> class_& def(char const* name, Fn fn, A1 const& a1, A2 const& a2); template <class Fn, class A1, class A2, class A3> class_& def(char const* name, Fn fn, A1 const& a1, A2 const& a2, A3 const& a3);
Имяntbs, которое соответствует правилам именования идентификаторов Python. Если a1 является результатомперегрузки-диспетчеризации-экспрессии, допускается только вторая форма, и fn должен быть указателем для функции или указателем для функции члена, чьяаритмиясовпадает с максимальной аритмией A1.
Эффекты:Для каждого префикса<P
>из<Fn
>последовательности типов аргументов, начиная с того, длина которого составляет<A1
>'sминимальной плотности, добавляется<name(...)
>метод перегрузки в класс расширения. Каждая сгенерированная перегрузка вызывает экспрессию вызова a1 с<P
>, используя копию политик вызова a1. Если самый длинный действительный префикс<A1
>содержит<N
>типов и a1 содержит<M
>ключевые слова, начальная последовательность ключевых слов используется для всех, кроме первых<N-M
>аргументов каждой перегрузки.
В противном случае Fn должен быть [получен из]объекта, и a1-a2, если он поставляется, может быть выделен в любом порядке из первых двух строк таблицы ниже. Чтобы быть полезным, fn должен бытьвызывающим.
Требования/Свойства типа | Эффекты | ||||||
---|---|---|---|---|---|---|---|
Любыеntbs | |||||||
МодельCallPolicies | Копия будет использоваться в качестве политики вызова результирующего метода перегрузки. | ||||||
Ключевые слова | Результат выраженияключевого слова, указывающего не больше аргументов, чемarityfn. | Копия будет использоваться в качестве политики вызова результирующего метода перегрузки. |
<*this
>
class_& staticmethod(char const* name);
Имяntbs, которое соответствует правилам именования идентификаторовPythonи соответствует методу, перегрузки которого были определены.
Заменяет существующий названный атрибут<x
>результатом вызова<staticmethod(x)
>в Python. Указывает, что соответствующий метод является статическим и, следовательно, не будет передан объектный экземпляр. Это эквивалентно утверждению Python:
setattr(self, name, staticmethod(getattr(self, name)))
template <unspecified> class_& def(detail::operator_<unspecified>);
Добавляет Pythonспециальный метод, как описаноздесь.
<*this
>
template <class U> class_& setattr(char const* name, U const& u);
Имя - этоntbs, которое соответствует правилам именования идентификаторов Python.
Преобразует<u
>в Python и добавляет его в словарь атрибутов класса расширений:
PyObject_SetAttrString(this->ptr(), name, object(u).ptr());
<*this
>
template <class Get> void add_property(char const* name, Get const& fget, char const* doc=0); template <class Get, class Set> void add_property( char const* name, Get const& fget, Set const& fset, char const* doc=0);
Имя - этоntbs, которые соответствуют правилам именования идентификаторов Python.
Создает новый экземпляр класса Python, передавая<object(fget)
>(и<object(fset)
>во второй форме) с (необязательной) докстрингом<doc
>своему конструктору, затем добавляет это свойство к строящемуся объекту класса Python с заданным именем атрибута.
<*this
>
Позволяет пользователям легко выставлять функции, которые могут быть вызваны из Python с синтаксисом доступа к атрибутам.
template <class Get> void add_static_property(char const* name, Get const& fget); template <class Get, class Set> void add_static_property(char const* name, Get const& fget, Set const& fset);
Имя - этоntbs, которое соответствует правилам именования идентификаторов Python.
Создает объект Boost.Python.StaticProperty, передавая<object(fget)
>(и<object(fset)
>во второй форме) своему конструктору, затем добавляет это свойство в строящийся класс Python с заданным именем атрибута. StaticProperty - это особый подкласс класса свойств Python, который можно назвать без первоначального самоаргумента.
<*this
>
Позволяет пользователям легко выставлять функции, которые могут быть вызваны из Python со статическим синтаксисом доступа к атрибутам.
template <class D> class_& def_readonly(char const* name, D T::*pm, char const* doc=0); template <class D> class_& def_readonly(char const* name, D const& d);
Имя - этоntbs, которое соответствует правилам именования идентификаторов Python.<doc
>также являетсяntbs.
this->add_property(name, make_getter(pm), doc);
и
this->add_static_property(name, make_getter(d));
соответственно.
<*this
>
Позволяет пользователям легко разоблачать элемент данных класса или бесплатную переменную, чтобы ее можно было проверить с помощью естественного синтаксиса.
template <class D> class_& def_readwrite(char const* name, D T::*pm, char const* doc=0); template <class D> class_& def_readwrite(char const* name, D& d);
this->add_property(name, make_getter(pm), make_setter(pm), doc);
и
this->add_static_property(name, make_getter(d), make_setter(d));
соответственно.
<*this
>
Позволяет пользователям легко разоблачать данные класса или бесплатный переменный элемент, чтобы его можно было проверить и установить из Python с естественным синтаксисом.
template <typename PickleSuite> class_& def_pickle(PickleSuite const&);
PickleSuite должен быть публично получен изpickle_suite.
Определяет правовую комбинацию специальных атрибутов и методов: __getinitargs__, __getstate__, __setstate__, __getstate_manages_dict__, __safe_for_unpickling__, __reduce__
<*this
>
Обеспечиваетпростой в использовании высокоуровневый интерфейсдля установки полнойподдержки огурцовдля класса обертывания. Пользователь защищен проверками согласованности времени компиляции.
class_& enable_pickling();
Метод __reduce__ и атрибут __safe_for_unpickling__.
<*this
>
Легкая альтернатива def_pickle(). Позволяет реализовать поддержку пикселей от Python.
Последовательность MPL, которая может быть использована в class_<...>инстанциациях, указывает на список базовых классов.
namespace boost { namespace python { template <T1 = unspecified,...Tn = unspecified> struct bases {}; }}
Объявление класса C++:
class Foo : public Bar, public Baz { public: Foo(int x, char const* y); Foo(double); std::string const& name() { return m_name; } void name(char const*); double value; // public data private: ... };
соответствующего повышения. Класс расширения Python может быть создан с помощью:
using namespace boost::python; class_<Foo,bases<Bar,Baz> >("Foo", "This is Foo's docstring." "It describes our Foo extension class", init<int,char const*>(args("x","y"), "__init__ docstring") ) .def(init<double>()) .def("get_name", &Foo::get_name, return_internal_reference<>()) .def("set_name", &Foo::set_name) .def_readwrite("value", &Foo::value);
Статья Chapter 2. High Level Components раздела Boost.Python Reference Manual Boost.Python Reference Manual может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Boost.Python Reference Manual ::
реклама |