Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
boost_python [2008/04/14 21:01] kamituel |
boost_python [2008/04/16 07:24] (aktualna) kamituel |
||
|---|---|---|---|
| Linia 32: | Linia 32: | ||
| BOOST_PYTHON_MODULE(p1) { | BOOST_PYTHON_MODULE(p1) { | ||
| - | def("skomplikowany_algorytm", &potega); | + | .def("skomplikowany_algorytm", &potega); |
| } | } | ||
| </code> | </code> | ||
| Linia 49: | Linia 49: | ||
| <code python> | <code python> | ||
| + | #!/usr/bin/python | ||
| import p1 | import p1 | ||
| Linia 114: | Linia 115: | ||
| </code> | </code> | ||
| Potrzebujemy sppecjalnego wrappera dla ''Costam_0'' ponieważ twórcy biblioteki uznali, że najlepiej jest gdy pisząc moduł Pythona nie musimy modyfikować istniejącego kodu C++.\\ Wrapper ten nie robi właściwie nic oprócz wołania odpowiedniej metody. Warto zauważyć, że potrzebujemy go tylko dlatego, że klasa ''Costam_0'' posiada czysto wirtualną metodę.\\ | Potrzebujemy sppecjalnego wrappera dla ''Costam_0'' ponieważ twórcy biblioteki uznali, że najlepiej jest gdy pisząc moduł Pythona nie musimy modyfikować istniejącego kodu C++.\\ Wrapper ten nie robi właściwie nic oprócz wołania odpowiedniej metody. Warto zauważyć, że potrzebujemy go tylko dlatego, że klasa ''Costam_0'' posiada czysto wirtualną metodę.\\ | ||
| - | W definicji modułu widzimy, że najpierw deklarujemy chęć udostępnienia klasy - jako nazwę podajemy jednak nazwę modułu! Klasa ta widoczna będzie w Pythonie pod nazwą ''Costam0'' i będzie posiadała jedną metodę. Następnie definiujemy funkcję ''metoda'' zaznaczając, że jest ona czysto wirtualną składową klasy. | + | W definicji modułu widzimy, że najpierw deklarujemy chęć udostępnienia klasy - jako nazwę podajemy jednak nazwę klasy wrappera! Klasa ta widoczna będzie w Pythonie pod nazwą ''Costam0'' i będzie posiadała jedną metodę. Następnie definiujemy funkcję ''metoda'' zaznaczając, że jest ona czysto wirtualną składową klasy. |
| Zajmijmy się teraz klasą ''Costam_A''. Dziedziczy ona po ''Costam_0''. Aby ją udostępnić, musimy dopisać poniższy kod w ramach bloku BOOST_PYTHON_MODULE: | Zajmijmy się teraz klasą ''Costam_A''. Dziedziczy ona po ''Costam_0''. Aby ją udostępnić, musimy dopisać poniższy kod w ramach bloku BOOST_PYTHON_MODULE: | ||
| Linia 129: | Linia 130: | ||
| I w końcu - zwróćmy uwagę na brak definicji metody ''metoda'' - jako że nasza klasa dziedziczy po ''Costam_0'', i w tamtej klasie tę metodę udostępniliśmy, teraz już nie musimy tego robić.\\ | I w końcu - zwróćmy uwagę na brak definicji metody ''metoda'' - jako że nasza klasa dziedziczy po ''Costam_0'', i w tamtej klasie tę metodę udostępniliśmy, teraz już nie musimy tego robić.\\ | ||
| - | Ostatnia z klas udostępniona może być w ten sposób: | + | Ostatnia z klas udostępniona może być w taki sposób: |
| <code cpp> | <code cpp> | ||
| class_<Costam_B, bases<Costam_A> >("CostamB", init<std::string>()) | class_<Costam_B, bases<Costam_A> >("CostamB", init<std::string>()) | ||
| Linia 189: | Linia 190: | ||
| #b.x_ro = "To sie nie zapisze!" | #b.x_ro = "To sie nie zapisze!" | ||
| </code> | </code> | ||
| + | Po uruchomieniu naszym oczom ukaże się: | ||
| + | <code>$ ./p2.py | ||
| + | AAA A aaa | ||
| + | BBB B bbb | ||
| + | CCC C ccc | ||
| + | BBB B bbb ++ PLUS DZIALA | ||
| + | Zapisalo sie! | ||
| + | Zapisalo sie! | ||
| + | </code> | ||
| + | Widzimy więc, że wszystkie elementy działają poprawnie. Co więcej - po odkomentowaniu niektórych fragmentów - np. próby zapisania do zmiennej tylko do odczytu ''x_ro'' interpreter poinformuje nas o błędzie: | ||
| + | <code>$ ./p2.py | ||
| + | AAA A aaa | ||
| + | BBB B bbb | ||
| + | CCC C ccc | ||
| + | BBB B bbb ++ PLUS DZIALA | ||
| + | Zapisalo sie! | ||
| + | Zapisalo sie! | ||
| + | Traceback (most recent call last): | ||
| + | File "./p2.py", line 39, in <module> | ||
| + | b.x_ro = "To sie nie zapisze!" | ||
| + | AttributeError: can't set attribute | ||
| + | </code> | ||
| ==== Z życia wzięte ==== | ==== Z życia wzięte ==== | ||
| Linia 198: | Linia 220: | ||
| * Aplikację napisać w C++ a GUI w, dużo przyjemniejszym, Pythonie | * Aplikację napisać w C++ a GUI w, dużo przyjemniejszym, Pythonie | ||
| * Mamy dostęp do biblioteki C++, ale nie mamy do niej źródeł | * Mamy dostęp do biblioteki C++, ale nie mamy do niej źródeł | ||
| - | W tym ostatnim przypadku jedyne co nam będzie potrzebne to pliki nagłówkowe tej bilioteki i parę minut czasu. | + | W tym ostatnim przypadku jedyne co nam będzie potrzebne to pliki nagłówkowe tej bilioteki i trochę minut czasu. |
| Weźmy klasy z poprzedniego przykładu, rozdzielmy je na plik nagłówkowy i źródłowy. | Weźmy klasy z poprzedniego przykładu, rozdzielmy je na plik nagłówkowy i źródłowy. | ||