Hermetyzacja (enkapsulacja)
1. Co to jest hermetyzacja (enkapsulacja)?
Hermetyzacja (ang. encapsulation) to jeden z fundamentów programowania obiektowego.
- Polega na ukrywaniu szczegółów implementacji obiektu i udostępnianiu bezpiecznego dostępu do jego atrybutów i metod.
-
Dzięki niej:
- chronimy dane obiektu przed przypadkową zmianą,
- kontrolujemy dostęp do atrybutów,
- zachowujemy spójność stanu obiektu,
- zmniejszamy ryzyko błędów w programie.
2. Modyfikatory dostępu w Pythonie
Modyfikatory dostępu określają widoczność atrybutów i metod. W Pythonie stosuje się konwencje nazewnicze:
| Typ atrybutu/metody | Notacja w Pythonie | Dostępność |
|---|---|---|
| Publiczny | nazwa |
dostępny wszędzie, standardowy przypadek |
| Chroniony | _nazwa |
dostępny w klasie i klasach dziedziczących (konwencja, nie jest wymuszony) |
| Prywatny | __nazwa |
„ukryty” przed bezpośrednim dostępem spoza klasy (Python używa name mangling) |
2.1 Atrybuty publiczne
- Standardowe atrybuty, dostępne bez ograniczeń.
- Mogą być odczytywane i modyfikowane bezpośrednio.
2.2 Atrybuty chronione
- Zaczynają się od jednego podkreślenia
_. - Zgodnie z konwencją: nie powinny być używane na zewnątrz klasy, ale można po prostu odczytać/zmienić.
2.3 Atrybuty prywatne
- Zaczynają się od dwóch podkreśleń
__. - Python stosuje name mangling → zmienia nazwę atrybutu wewnętrznie (
_Klasa__nazwa), aby utrudnić bezpośredni dostęp.
3. Gettery i settery
Gettery i settery pozwalają kontrolować odczyt i zapis atrybutów.
- Dzięki nim możemy np. walidować dane przed zapisaniem.
4. Dekorator @property
W Pythonie wygodniejszym sposobem tworzenia getterów i setterów jest użycie dekoratora @property.
- Pozwala odczytywać atrybut jak zwykłą zmienną, ale pod spodem wywołuje metodę.
- Dodatkowo można użyć
@<nazwa>.setter, aby ustawić wartość.
Dzięki @property kod jest czytelniejszy, a kontrola nad atrybutami bezpieczna i wygodna.
5. Podsumowanie – hermetyzacja w praktyce
- Hermetyzacja chroni dane i wymusza kontrolowany dostęp do atrybutów.
- Publiczne → dostęp bez ograniczeń.
- Chronione → konwencja, używać tylko wewnątrz klasy i dziedziczących.
- Prywatne → ukryte przed bezpośrednim dostępem, wymuszają użycie getterów/setterów.
- Gettery i settery → umożliwiają walidację danych przed ich zapisaniem lub odczytem.
- Dekorator
@property→ elegancki sposób tworzenia kontrolowanego dostępu do pól obiektu.
Zaleta hermetyzacji: kod staje się bezpieczny, czytelny i łatwy w utrzymaniu, a obiekty zachowują spójny stan.