После того как связующий программный код будет сгенерирован и откомпилирован, сценарии Python смогут обращаться к классу C++, как если бы он был написан на Python. Фактически импортируемый теневой класс в модуле number.py, который выполняется поверх модуля расширения, является сгенерированным программным кодом Python. В примере 20.19 повторяются тесты классов из файла main.cxx. Однако здесь класс C++ используется из языка программирования Python — это может показаться удивительным, но со стороны Python программный код выглядит вполне естественным.
Пример 20.19. PP4E\Integrate\Extend\Swig\Shadow\main.py
пример использования класса C++ в Python (модуль c++ + теневой класс py) этот сценарий выполняет те же самые тесты, что и файл main.cxx C++
from number import |
Number # импортировать теневой класс для модуля |
C++ |
num = Number(1) |
# создать объект класса C++ в Python |
|
num.add(4) |
# вызвать его методы из Python |
|
num.display() |
# num хранит указатель ‘this‘ языка C++ |
|
num.sub(2) |
|
|
num.display() |
|
|
res = num.square() |
# преобразует возвращаемое из C++ значение |
int |
print(‘square: ‘, |
res) |
|
num.data = 99 |
# установить член data C++, сгенерированный _ |
setattr |
val = num.data # получить член data C++, сгенерированный __getattr__ print(‘data: ‘, val) # вернет обычный объект Python целого числа print(‘data+1: ‘, val + 1)
num.display() print(num) # вызовет repr в теневом классе
del num # автоматически вызовет деструктор C++
Так как класс C++ и его обертки автоматически загружаются при импорте модуля number.py теневого класса, этот сценарий выполняется, как всякий другой:
…/PP4E/Integrate/Extend/Swig/Shadow$ python main.py Number: 1 add 4 Number=5 sub 2 Number=3 square: 9 data: 99
data+1: 100
Number=99
<number.Number; proxy of <Swig Object of type ‘Number *’ at 0x7ff4bb48> > ~Number: 99
Этот вывод производится в основном методами класса C++ и в значительной степени совпадает с результатами работы программы main.cxx, представленной в примере 20.16 (кроме вывода информации об экземпляре — теперь это экземпляр теневого класса Python).
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011