Narzędzia użytkownika

Narzędzia witryny


boost_python

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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. ​
  
boost_python.1208199713.txt.gz · ostatnio zmienione: 2008/04/14 21:01 przez kamituel