|
|
|
|
|
|
[ 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.pldoc.pisz.plpdf.pisz.plbialaorchidea.pev.pl
|
|
|