WÄ…tki
 
[ Pobierz całość w formacie PDF ]

to oparte jest na konwencji. (Z drugiej strony, implementacja Pythona, która jest całkowicie napisana w C, może
całkowicie ukryć szczegóły implementacyjne i kontrolować zakres dostępu do obiektu, jeśli jest to konieczne. Jest
do pewna droga postępowania dla wszelkich rozszerzeń Pythona pisanych w C).
Klienci powinni używać atrybutów danych z pewną dozą ostrożności  mogą narobić dużo bałaganu w niezmi-
ennikach metod poprzez naruszanie ich atrybutów danych. Proszę zauważyć, że można dodawać nowe atrybuty
danych do obiektu konkretu bez naruszania poprawności działania metod pod warunkiem, że uniknięto konfliktu
nazw  trzeba to znów zaznaczyć: trzymanie się konwencji w nazewnictwie może zaoszczędzić bólu głowy w
tym względzie.
Nie istnieje skrócony sposób dostępu z wnętrza metody do atrybutów danych (lub innych metod)! Moim zdaniem,
zwiększa to czytelność ich kodu: nie ma szansy pomieszania nazw zmiennych lokalnych i zmiennych konkretu
podczas przeglądania programu zródłowego.
Przyjęta ogólnie konwencją jest nazywanie pierwszego argumentu metody self.4 To nic więcej niż kon-
wencja: nazwaselfnie ma zupełnie żadnego specjalnego znaczenia w Pythonie (proszę jednak zauważyć, że nie
przestrzeganie tej konwencji może spowodować powstanie mniej czytelnego kodu oraz to, że niektóre narzędzia
służące do przeglądania definicji klas mogą polegać właśnie na tej konwencji)5
Każdy obiekt funkcji, który jest atrybutem klasy definiuje metodę dla konkretu tej klasy. Nie jest konieczne aby
definicja takiej funkcji była tekstowo umieszczona w definicji jej klasy: przypisanie obiektu funkcji do lokalnej
zmiennej w klasie powoduje to samo jakby była ona tam umieszczona. Na przykład:
# Funkcja zdefiniowana poza obrębem klasy
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return  witaj świecie
h = g
W tym wypadkuf,gihsą wszystkie atrybutami klasyC, których wartością są obiekty funkcji i w konsekwencji
stają się metodami konkretów klasy C  h jest dokładnie odpowiednikiem g. Proszę zauważyć, że w praktyce
taka kombinacja służy jedynie do wprowadzenia czytelnika takiego programu w stan głębokiego zmieszania i
frustracji.
Metody mogą wywoływać inne metody poprzez użycie atrybutów metod obiektuself, np.:
class Worek:
def __init__(self):
self.dane = []
def dodaj(self, x):
self.dane.append(x)
def dodaj_dwa_razy(self, x):
self.dodaj(x)
self.dodaj(x)
4
selfmożna przetÅ‚umaczyć w tym kontekÅ›cie jako «ja sam» lub «moja,mój». Dwa ostatnie okreÅ›lenia być może sÄ… bardziej adekwatne
jeżeli wezmiemy pod uwagę, że zaraz podselfnastępuje odniesienie do atrybutu konkretu, np.  self.atrybut (przyp. tłum.).
5
Dlatego też zrezygnowaÅ‚em z tÅ‚umaczenia tej nazw w przykÅ‚adach na sÅ‚owo takie jak «ja», albo «siÄ™» (przyp. tÅ‚um.).
62 Rozdział 9. Klasy
Metody mogą używac odniesień do nazw globalnych w ten sam sposób jak zwykłe funkcje. Zasięg globalny
związany z metodą jest po prostu tym modułem, który zawiera definicje klasy (sam klasa nigdy nie jest używana
jako zasięg globalny). Zazwyczaj rzadko można spotkać odniesienia do zmiennych globalnych w metodach.
Istnieje parę dobrych powodów do używania zmiennych globalnych: funkcje i moduły importowane do przestrzeni
nazw globalnych mogą zostać użyte przez metody, tak samo jak funkcje i klasy należace do tej samej przestrzeni.
Zwykle klasa zawierająca tę metodę sama jest zdefiniowana w globalnym zasięgu. W następnym podrozdziale
będzie się można dowiedzieć, dlaczego w metodzie trzeba czasami użyć odniesienia do jej własnej klasy!
9.5 Dziedziczenie
Bez istnienia mechanizmu dziedziczenia, ta cecha języka, która określana jest mianem  klasy nie byłaby jego
warta. Poniżej podano składnię definicji klasy dziedziczącej:
class NazwaKlasyPotomnej(NazwaKlasyBazowej):
.
.
.
NazwaNazwaKlasyBazowejmusi być zdefiniowana w zasięgu zawierającym definicję klasy pochodnej. Za-
miast nazwy klasy bazowej dopuszcza się również wyrażenie. Jest to szczególnie przydatne, jeśli nazwa klasy
bazowej zdefiniowana jest w innym module, np.:
class NazwaKlasyPochodnej(modul.NazwaKlasyBazowej):
Wykonanie definicji klasy pochodnej następuje w taki sam sposób jak dla klasy bazowej. Klasa jest zapamięty-
wana w momencie stworzenia obiektu klasy. Ten mechanizm używany jest w procesie rozstrzygania odniesień
do atrybutów konkretu takiej klasy: jeśli poszukiwany atrybut nie jest znajdowany w klasie, poszukiwany jest w
klasie bazowej. Ta zasada stosowana jest rekurencyjnie w przypadku, gdy klasa bazowa jest pochodnÄ… innej.
W konkretyzacji takiej klasy nie ma nic szczególnego:NazwaKlasyPochodnej()tworzy nowy konkret klasy.
Odniesienia do metod rozstrzygane są w następujący sposób: poszukuje się odpowiedniego atrybutu klasy, jeśli
jest to konieczne, schodzi się z poszukiwaniem w głąb drzewa dziedziczenia. Gdy odniesienie wskazuje na obiekt
funkcji, metoda uznawana jest za poprawnÄ….
Klasy pochodne mogą przesłaniać metody ich klas bazowych. Metody nie są obsługiwane w żaden uprzywile- [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • bialaorchidea.pev.pl
  •  
    Copyright © 2006 MySite. Designed by Web Page Templates