SAMOUCZEK JĘZYKA PYTHON ROZDZIAŁY   
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 7: Luźne uwagi


Nazwy atrybuty danych przesłaniają te same nazwy metod. Przyjęło się używać pewnej konwencji w nazewnictwie, aby uniknąć przypadkowego konfliktu nazw, co może powodować trudne do znalezienia błędy w dużych programach. Na przykład, rozpoczynanie nazw metod od dużej litery, dodawanie przedrostka do nazwy atrybutu danych (zazwyczaj jest to znak podkreślenia "_") lub używanie czasowników dla metod i rzeczowników dla danych.

Atrybuty danych mogą być użyte w metodach w ten sam sposób, w jaki używane są przez zwykłych użytkowników ("klientów") obiektu. Klasy w Pythonie nie są użyteczne jako środek do implementacji "czystych" abstrakcyjnych typów danych. W rzeczywistości, nic w Pythonie nie umożliwia ukrywania danych - wszystko 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 niezmiennikach 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 źródłowego.

Przyjęta ogólnie konwencją jest nazywanie pierwszego argumentu metody self (self moż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 weźmiemy pod uwagę, że zaraz pod self następuje odniesienie do atrybutu konkretu, np. "self.atrybut" ). To nic więcej niż konwencja: nazwa self nie 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)

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'
...    h = g

W tym wypadku f, g i h są wszystkie atrybutami klasy C, których wartością są obiekty funkcji i w konsekwencji stają się metodami konkretów klasy C - h jest dokładnie odpowiednikiem g.

Metody mogą wywoływać inne metody poprzez użycie atrybutów metod obiektu self, 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)

Metody mogą używać 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 (sama klasa nigdy nie jest używana jako zasięg globalny). 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.

Strona główna - O Pythonie - Interpreter - Samouczek - Przykłady programów - Linki