Rozdział 14 · Tworzenie rzeczywistych obiektów

Enkapsulacja

Atrybuty są dostępne bezpośrednio — i to może zepsuć stan obiektu. Dowiadujemy się, jak tego uniknąć.

Problem: Atrybuty są dostępne bezpośrednio

Nic nie stoi na przeszkodzie w zmianie atrybutu obiektu, omijając wszystkie metody — bezpośrednio i zewnętrznie Klasa:

Debug Lab 5: bezpośrednie przypisanie psuje stan obiektu
slomannoe_zdorove.py
anna = Player("Anna")
anna.health = -50    # bezpośrednio, omijając take_damage()
print(anna.health)
>>> print(anna.health)
-50
Co widać na ekranie

Metoda take_damage() niezgrabnie nie daje health zejść poniżej zera — ale NIC nie zmusza cię do stosowania tej konkretnej metody. Przydział anna.health = -50 omija całkowicie logikę obronną bezpośrednio, a obiekt trafia w stan, który sama klasa uważała za niemożliwy.

Poprawiony kod
cherez_metod.py
anna.take_damage(150)   #health poprawnie zatrzymuje się na 0
print(anna.health)

Enkapsulacja jest idea przechowywania stanu obiektu „wewnątrz”

Konwencja nazewnictwa: _internal i __name

NagraniaCo oznacza według konwencji
nameatrybut publiczny – używaj go swobodnie poza
_name„wewnętrzny”
__nameobejmuje podstawienie nazw (name mangling) – dostęp z zewnątrz jest trudny, ale nie znika
dvojnoe_podcherkivanie.py
class Konto:
    def __init__(self, balans):
        self.__balans = balans

schet = Konto(100)
print(schet._Konto__balans)   # 100 — dostęp JEST, po prostu nazwa została zmieniona
Częste nieporozumienie: «__private naprawdę prywatny»
To nieprawda – na poziomie języka w Python nie ma prawdziwej prywatności. __balans automatycznie zmienia nazwę na _Konto__balans (name mangling) – chroni to głównie przed PRZYPADKOWYM dziedziczeniem imion, a nie przed celowym uzyskaniem dostępu z zewnątrz. Enkapsulacja w Python to umowa i dyscyplina dowództwa, a nie zakaz ze strony tłumacza.
Praktyka: enkapsulacja
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →