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
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
| Nagrania | Co oznacza według konwencji |
|---|---|
name | atrybut publiczny – używaj go swobodnie poza |
_name | „wewnętrzny” |
__name | obejmuje 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