Обертывание классов C++ с помощью SWIG

obertyvanie klassov c s pomoshhju swig 1 Интеграция Python/C

До сих пор в этой главе мы имели дело с модулями расширений на C — простыми библиотеками функций. Чтобы реализовать на C поддержку объектов, позволяющих создавать множество экземпляров, необходимо написать расширение типа, а не модуль. Подобно классам в языке Python типы C генерируют объекты, позволяющие создавать множество экземпляров, и могут переопределять (то есть предоставлять свою реализацию) операторы выражений Python и операции над типом. Типы C также могут поддерживать возможность создания подклассов, подобно классам Python, в значительной степени благодаря тому, что различия между типами и классами в Python 3.X были практически полностью стерты.

Увидеть, как выглядят типы C, вы можете в собственной библиотеке с исходными текстами Python — загляните в каталог Objects. Программный код с определением типа на C может оказаться очень длинным — в нем необходимо определить алгоритм создания экземпляров, именованные методы, реализацию операторов, тип итератора и так далее и связать все это воедино с помощью таблиц — но это в основном типовой программный код, который имеет похожую структуру для большинства типов.

Создавать новые типы на C можно вручную, и в некоторых случаях в этом есть определенный смысл. Но в целом в этом нет необходимости — благодаря тому, что SWIG умеет генерировать связующий программный код для классов C++, имеется возможность автоматически генерировать весь необходимый программный код расширения на C и класса обертки для интеграции таких объектов, просто обрабатывая соответствующее объявление класса с помощью SWIG. Прием обертывания классов C++ обеспечивает возможность создания типов данных подобно приему создания типов на C, но он может оказаться существенно проще в реализации благодаря тому, что SWIG берет на себя решение всех проблем интеграции языков.

Вот как это происходит: на основе имеющегося определения класса C++ и специальных параметров командной строки SWIG генерирует следующие компоненты:

     Написанный на C++ модуль расширения Python с функциями доступа, взаимодействующими с методами и членами класса C++.

     Написанный на Python модуль с классом-оберткой (на языке SWIG он называется «теневым» классом), взаимодействующий с модулем функций доступа к классу C++.

Как и прежде, чтобы задействовать SWIG, нужно написать и отладить класс, как если бы он использовался исключительно в программном коде C++. Затем просто запустить SWIG в make-файле для сканирования объявления класса C++ и скомпилировать вывод. В итоге, импортируя теневые классы, в сценариях Python можно использовать классы C++, как если бы они были написаны на языке Python. Программы Python не только могут создавать и использовать экземпляры классов C++, но и выполнять их индивидуальную подгонку путем создания подклассов сгенерированного теневого класса.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий