|
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
|
|