|
Rozdział 8: Klasy
1: Terminologia- 2: Przestrzenie i zasięgi nazw w Pythonie- 3: Składnia definicji klasy
- 4: Obiekty klasy 5: Obiekty konkretu klasy- 6: Obiekty metod- 7: Luźne uwagi
- 8: Dziedziczenie- 9: Dziedziczenie wielorakie 10: Zmienne prywatne- 11: Sztuczki i chwyty
- 12: Wjątki mogą być klasami
Lekcja 1: Słowo na temat terminologii
System klas w Pythonie wyrażony jest minimalnym zestawem nowych środków składniowych i
semantycznych. Jest to mieszanka mechanizmów znanych w C++ i Moduli-3. Tak jak w przypadku
modułów, klasy w Pythonie nie stawiają żadnych barier pomiędzy swoją definicją a programistą.
Polega się tutaj raczej na "grzeczności" programisty, którego dobre wychowanie nie pozwala na "włamywanie się do definicji" klasy. Najważniejsze cechy systemu klas zachowane są tu w całej
swej mocy: mechanizm dziedziczenia klas pozwala na posiadanie wielu klas bazowych, klasa
pochodna jest w stanie przesłonić definicje metod klas bazowych, jej metoda może wywoływać
metodę klasy bazowej o tej samej nazwie. Obiekty mogą posiadać dowolną liczbę danych prywatnych.
W terminologii przejętej w C++, wszystkie składowe klasy pythonowej (włącznie z atrybutami) są
publiczne, a wszystkie funkcje składowe są wirtualne. Nie istnieją specjalne funkcje destruktora
i konstruktora. Podobnie jak w Moduli-3 nie istnieją skrótowe sposoby zapisu odniesienia do
składowej obiektu we wnętrzu metody: metoda deklarowana jest z wymienionym wprost pierwszym
argumentem reprezentującym obiekt, na rzecz którego zostanie wywołana. Podobnie jak w
Smalltalku, klasy same są obiektami, aczkolwiek w szerszym tego słowa znaczeniu: w Pythonie
wszystkie typy danych to obiekty. Ta cecha określa semantykę mechanizmu importowania i zmiany
nazw. Jednak, podobnie jak w C++ i Moduli-3, typy wbudowane nie mogą być użyte jako klasy bazowe
klas zdefiniowanych przez użytkownika. Tak jak w C++, ale w odróżnieniu od Moduli-3, większość
wbudowanych operatorów mogą zostać za pomocą specjalnej składni przedefiniowane dla różnych
typów klasowych.
Z powodu braku ogólnie przyjętej terminologii, w odniesieniu do klas używać będę terminów z
języka Smalltalk i C++.
Należy wiedzieć, że istnieje pewna terminologiczna pułapka dla czytelników obeznanych z
technologią obiektową: słowo «obiekt» w Pythonie nie oznacza koniecznie konkretu (instancji)
klasy. Podobnie jak w C++ i Moduli-3, w odróżnieniu od Smalltalka, nie wszystkie typy w Pythonie
są klasowe. Podstawowe, wbudowane typy danych, jak liczby całkowite i listy nie są klasowe
(tzn. nie posiadają klasy), nawet tak egzotyczne typy jak pliki też nie są. Jednakże, wszystkie
typy Pythona przejawiają w swym zachowaniu to, co najlepiej można by wyrazić słowem «obiekt».
Obiekty posiadają swoją indywidualność, mogąc posiadać jednocześnie wiele nazw (w wielu
zasięgach nazw). W innych językach programowania nazywa się to aliasami. Zazwyczaj nie jest to
docenianie przy pierwszym spotkaniu z Pythonem i w bezpieczny sposób jest ignorowane przy pracy
z niemutowalnymi typami danych (liczbami, napisami, niemutowalnymi listami). Jednakże, aliasy
wpływają (celowo) na semantykę kodu Pythona, gdy w grę wchodzą mutowalne typy danych, takie jak
listy, słowniki i większość typów reprezentujących byty jednostkowe na zewnątrz programu
(pliki, okna itp.) Zwykle aliasy przynoszą korzyści, ponieważ zachowują się pod pewnymi
względami jak wskaźniki. Na przykład: przekazanie obiektu jako argumentu wywołania nie kosztuje
dużo tylko w przypadku przekazania przez implementację wskaźnika do niego. Jeżeli funkcja
modyfikuje przekazany w ten sposób obiekt, wywołujący funkcje widzi tę zmianę - jest to powodem
występowania dwóch różnych mechanizmów przekazywania parametrów np. w Pascalu.
|
|