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.