Obiektowe aspekty Pythona
Cechą Pythona jest obiektowość. Mówiąc językiem technicznym obiekt to instancja klasy. Klasa to w pewnym sensie szablon opisu, czyli informacja, jakie są pola (jakie informacje można przechowywać) oraz metody (jakie czynności wykonywać). Obiekt z kolei to 'konkretny przypadek', czyli klasa oraz konkretne informacje, (wartości pól) które składają się na określony stan całego obiektu. Aby zobrazować to przykładem – klasa to np. Człowiek. Wiemy o niej, że ma pola 'imię' i 'nazwisko', ale w przypadku klasy nie mówimy o wartościach tych pól – po prostu, że takie pola są. Klasa to człowiek jako gatunek, istota. Obiekt z kolei to konkretny człowiek – taki, który posiada imię i nazwisko. Zawsze istnieje więc tylko jedna klasa danego typu, ale może istnieć wiele obiektów danej klasy.
O obiekcie mówimy, że jest pewnego typu – typem obiektu jest klasa, którą obiekt reprezentuje. Na przykład obiekt Jan Kowalski jest typu Człowiek (w kategoriach programowania obiektowego).
Metody klas różnią się od zwykłych funkcji tylko jednym detalem - muszą mieć dodatkową zmienną umieszczaną na początku listy parametrów, której jednak nie przypisuje się żadnej wartości podczas wywoływania metody - Python sam ją podaje. Ta konkretna zmienna odnosi się do samego obiektu i, zgodnie z konwencją, nazywana jest self.
Najprostszą formą definicji klasy jest:
class ClassName:
<statement-1>
.
.
.
<statement-N>
Definicje klas, podobnie jak definicje funkcji (instrukcja def) muszą zostać zdefiniowane przed ich użyciem (można umieścić definicję klasy w rozgałęzieniu instrukcji if lub wewnątrz funkcji).
Definicja funkcji w ciele klasy posiada zwykle szczególną formę listy argumentów formalnych, dedykowanych szczególnej konwencji wywoływania metod.
To tyle odnośnie samej teorii. Kolejną rzeczą, którą należy zmodyfikować w naszym pliku test.py jest przypisanie funkcji do przycisku w:
,
która ma postać:
.
Nie można również zapomnieć o tym, że należy przypiąć podobną funkcję do:
w postaci:
.
Skoro mamy już przypisaną funkcję do przycisku, to czas zająć się utworzeniem konstrukcji, która będzie nam generować dane. Dodatkowo niektóre dane wymagają uwzględnienia płci. W moim przypadku będzie to wyglądać następująco:
Zatrzymajmy się chwilę na tym powyższym przykładzie, ponieważ pojawiło się kilka nowych rzeczy - instrukcja if, else oraz moduł random.choice.
Konstrukcja if jest używana do sprawdzania warunków. Jeżeli warunek jest prawdziwy, uruchamiamy blok operacji (zwany blokiem if), w przeciwnym wypadku wywołujemy inny blok (zwany blokiem else). Sekcja else jest opcjonalna.
Moduł random.choice przydaje się wtedy, gdy chcemy podzielić naszą aplikację lub program na kilka plików w celu łatwiejszej ”pielęgnacji” całości. W momencie, kiedy będziecie chcieli użyć funkcji, którą napisaliście w paru innych programach bez potrzeby ciągłego kopiowania, Python wspomoże te działania poprzez możliwość umieszczenia definicji w pliku i używania ich w skrypcie lub w jego interaktywnej postaci. Ja dla potrzeb swojej aplikacji użyłam modułu random.choice, który umożliwia generowanie losowych liczb czy też losowych wartości z sekwencji.
Kolejnymi elementami, o które musimy uzupełnić plik test.py jest wstawienie konstrukcji umożliwiającej wygenerowanie nazwy miasta, ulicy, numeru PESEL oraz numeru dowodu osobistego.
Wygląda to tak:
Użyłam tutaj kolejnego modułu: random.randrange, który zwraca element losowo wybrany z zakresu range(start,stop,krok). Wywołanie metody równoważne jest wykonaniu następującego fragmentu kodu: choice(range(start, stop, krok)), z tą różnicą, że w przypadku wywołania metody randrange() nie jest tworzony obiekt zakresu. Dodatkowo PESEL i dowód uzyskałam przez wywołanie odpowiednich metod dostępu (get_personal_id_number oraz get_id_number). Takie metody wywoływane są w celu uzyskania dostępu do atrybutu klasy. Wynikiem działania metody powinna być (wyliczona) wartość atrybutu lub wygenerowanie wyjątku AttributeError.
Ostatnią rzeczą, którą należy dodać w naszym pliku to informacje o zaimportowanych modułach.
Moduły, podobnie jak wszystko inne w Pythonie, są obiektami. Jeśli wcześniej zaimportowaliśmy określony moduł, możemy pobrać do niego referencję za pośrednictwem globalnego słownika sys.modules. Moduł random implementuje generatory liczb pseudolosowych o różnych rozkładach. Umożliwia wybór losowej liczby całkowitej z zadanego zakresu jak również losowego elementu z podanej sekwencji przy założeniu równomiernego rozkładu prawdopodobieństwa. Implementuje również funkcję generującą losową permutację listy, działającą w miejscu, oraz funkcję wybierającą losowe elementy listy bez zwracania.
Jesteście ciekawi co dalej? Aby ułatwić pracę nad aplikacją stworzyłam dwa pliki.
Dane.py to nic innego, jak plik z klasą FakeData, którą można zaimportować i wykorzystać bez konieczności tworzenia instancji. Uważajcie, aby na tym etapie prac nad aplikacją nie nadpisywać zmiennych. To już od Was zależy, jak nazwiecie dane. Nie zapominajcie o przecinkach oraz znakach równości.
Przykład:
first_names_male = ( 'Jakub', 'Jan', 'Mateusz', 'Bartek', 'Kacper', 'Michał', 'Szymon', 'Antoni', 'Filip',
'Piotr', 'Maciej', 'Aleksander', 'Franciszek', 'Mikołaj', 'Adam', 'Stanisław', 'Wiktor',
'Krzysztof', 'Wojciech', 'Igor', 'Maksymilian', 'Karol', 'Dawid', 'Tomasz', 'Patryk',)
Podobnie jak w pliku test.py tutaj również należy umieścić definicję funkcji:
Każdorazowo tworzyłam taką definicję dla nazw ulic, miast, numeru PESEL i numeru dowodu.
Pojawiająca się tutaj instrukcja return powoduje powrót z funkcji z pewną wartością.
Powyższy materiał powinien Wam pomóc zrobić mini aplikację przy użyciu biblioteki PyQT4. Nie musi to być koniecznie generator danych. Najważniejszą kwestią jest tutaj realny cel, który chcecie osiągnąć ucząc się np. tej biblioteki. Poniżej przedstawiam Wam materiały dodatkowe, które wzbogacą Waszą wiedzą i kto wie, może postanowicie zrobić własną aplikację?
Bibliografia:
- http://www.python.rk.edu.pl/w/p/wprowadzenie-do-pyqt4/
- http://kobietydokodu.pl/
- http://www.learnpython.org/pl/Moduly_i_pakiety
- http://python.edu.pl/byteofpython/2.x/09.html