X

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

    Drogi użytkowniku!

    W trosce o komfort korzystania z naszego serwisu chcemy dostarczać Ci coraz lepsze usługi. By móc to robić prosimy, abyś wyraził zgodę na dopasowanie treści marketingowych do Twoich zachowań w serwisie. Zgoda ta pozwoli nam częściowo finansować rozwój świadczonych usług.

    Pamiętaj, że dbamy o Twoją prywatność. Nie zwiększamy zakresu naszych uprawnień bez Twojej zgody. Zadbamy również o bezpieczeństwo Twoich danych. Wyrażoną zgodę możesz cofnąć w każdej chwili.

     Tak, zgadzam się na nadanie mi "cookie" i korzystanie z danych przez Administratora Serwisu i jego partnerów w celu dopasowania treści do moich potrzeb. Przeczytałem(am) Politykę prywatności. Rozumiem ją i akceptuję.

     Tak, zgadzam się na przetwarzanie moich danych osobowych przez Administratora Serwisu i jego partnerów w celu personalizowania wyświetlanych mi reklam i dostosowania do mnie prezentowanych treści marketingowych. Przeczytałem(am) Politykę prywatności. Rozumiem ją i akceptuję.

    Wyrażenie powyższych zgód jest dobrowolne i możesz je w dowolnym momencie wycofać poprzez opcję: "Twoje zgody", dostępnej w prawym, dolnym rogu strony lub poprzez usunięcie "cookies" w swojej przeglądarce dla powyżej strony, z tym, że wycofanie zgody nie będzie miało wpływu na zgodność z prawem przetwarzania na podstawie zgody, przed jej wycofaniem.