În această lecție, vom discuta despre încapsulare în Python, ce este ea și cum să o implementăm folosind proprietăți și setteri.
Ce este încapsularea?
Încapsularea este unul dintre cele patru principii fundamentale ale programării orientate pe obiect (OOP) și se referă la restrângerea accesului la anumite componente ale unui obiect, astfel încât să se protejeze starea internă a acestuia și să se prevină modificări accidentale sau neautorizate. În esență, încapsularea permite ascunderea detaliilor implementării și expunerea doar a unei interfețe publice pentru interacțiunea cu obiectul.
În Python, încapsularea nu este impusă în mod strict, deoarece nu există modificatori de acces precum private sau protected (ca în alte limbaje de programare, precum Java sau C++). Cu toate acestea, putem implementa încapsularea prin convenții de denumire și folosind proprietăți și setteri.
Proprietăți și setteri
Proprietățile și setterii sunt mecanisme folosite în Python pentru a controla accesul și modificarea atributelor unei clase, implementând încapsularea.
Proprietăți
Proprietățile sunt metode care permit accesul la anumite atribute ale unei clase, fără a expune în mod direct acele atribute. Pentru a defini o proprietate, folosim decoratorul @property deasupra unei metode care returnează valoarea atributului pe care dorim să-l expunem.
Setteri
Setterii sunt metode care permit modificarea anumitor atribute ale unei clase, validând și asigurându-se că modificările sunt acceptabile înainte de a actualiza atributul. Pentru a defini un setter, folosim decoratorul @nume_proprietate.setter deasupra unei metode care primește valoarea pe care dorim să o setăm și actualizează atributul în mod corespunzător.
Exemplu: Încapsularea atributelor unei clase Persoana
class Persoana:
def __init__(self, nume, varsta):
self._nume = nume
self._varsta = varsta
@property
def nume(self):
return self._nume
@property
def varsta(self):
return self._varsta
@varsta.setter
def varsta(self, valoare):
if valoare < 0:
raise ValueError("Vârsta nu poate fi negativă!")
self._varsta = valoare
persoana = Persoana("Ion", 30)
# Accesarea atributelor prin proprietăți
print(persoana.nume)
print(persoana.varsta)
# Modificarea atributului varsta prin setter
persoana.varsta = 35
print(persoana.varsta)
# Încercarea de a seta o valoare negativă pentru varsta va genera o eroare
persoana.varsta = -5 # ValueError: Vârsta nu poate fi negativă!
În acest exemplu, am implementat încapsularea atributelor _nume și _varsta ale clasei Persoana, folosind proprietăți și setteri pentru a controla accesul și modificarea acestor atribute.
Prin folosirea încapsulării în Python, puteți crea clase mai sigure și mai ușor de întreținut, protejând starea internă a obiectelor și expunând doar interfețe publice pentru interacțiunea cu acestea.