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 10: Zmienne prywatne


Python posiada ograniczony mechanizm implementacji zmiennych prywatnych klasy. Każdy identyfikator o nazwie __fibo (przynajmniej dwa poprzedzające znaki podkreślenia i co najwyżej jeden znak podkreślenia kończący nazwę) jest zastępowany przez _nazwaklasy__fibo, gdzie nazwaklasy jest nazwą bieżącej klasy z usuniętymi znakami podkreślenia. Kodowanie to występuje zawsze, bez względu na pozycję składniową identyfikatora. Może to zostać użyte do zdefiniowania prywatnych konkretów klasy i zmiennych klasowych, metod, jak również obiektów globalnych, a nawet do przechowywania zmiennych konkretów tej klasy w konkretach innych klas. Ucięcie nazwy może wystąpić po przekroczeniu przez identyfikator długości 255 znaków. Poza granicami klasy, lub gdy nazwa klasy składa się tylko ze znaków podkreślenia, proces takiego kodowania nigdy nie zachodzi.

Kodowanie nazw ma na celu uzyskanie łatwego sposobu definiowania "prywatnych" zmiennych konkretu oraz metod bez martwienia się o zmienne konkretu zdefiniowane przez inne klasy pochodne, lub mucking with instance variables by code outside the class. Trzeba zauważyć, że zasady kodowania nazw przeznaczone są głównie w celu uniknięcia wypadków - dla zdeterminowanego programisty wciąż możliwe jest uzyskanie bezpośredniego dostępu do do zmiennej uważaną za prywatną. Jest to nawet szczególnie użyteczne np. w przypadku debuggerów. Dziedziczenie klasy o nazwie takiej samej jak jedna z klas bazowych powoduje bezpośredni dostęp do zmiennych prywatnych klasy bazowej).

Kod przekazany instrukcji exec i funkcji eval() lub evalfile() nie zawiera nazwy bieżącej klasy; this is similar to the effect of the global statement, the effect of which is likewise restricted to code that is byte-compiled together. To samo ograniczenie dotyczy getattr(), setattr() i delattr() oraz odwołań do kluczy słownika __dict__.

Poniżej przedstawiono przykład klasy, która implementuje swoje wersje metod __getattr__ i __setattr__. Za ich pomocą wszystkie atrybuty konkretu przechowywane są w zmiennej prywatnej (przypomina to sposób działania Pythona 1.4 i poprzednich wersji):

class VirtualAttributes:
    __vdict = None
    __vdict_name = locals().keys()[0]
     
    def __init__(self):
        self.__dict__[self.__vdict_name] = {}
    
    def __getattr__(self, name):
        return self.__vdict[name]
    
    def __setattr__(self, name, value):
        self.__vdict[name] = value

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