Treci la conținutul principal

Python Încapsulare

Scopul încapsulării este să protejeze datele din interiorul unei clase.

O clasă își ține datele (proprietățile) și metodele într-un singur loc și decide cum poate ajunge la acele date codul din afara clasei.

Drept urmare, datele sunt mai greu de modificat din greșeală, iar funcționarea internă a clasei rămâne ascunsă.


Proprietăți private

Începe numele unei proprietăți cu un dublu underscore, __, iar Python o tratează ca privată:

Notă: Codul din afara clasei nu are acces direct la o proprietate privată.

Exemplu

O clasă cu o proprietate privată numită __age:

Prompt
Scrie o clasă Python Person cu o proprietate privată __age. Încearcă să o accesezi din afara clasei.
Ieșire: program Python complet

Obținerea valorii unei proprietăți private

O metodă getter îi oferă codului din exterior o modalitate de a citi o proprietate privată:

Exemplu

Citește o proprietate privată printr-o metodă getter:

Prompt
Scrie o clasă Python Person cu o proprietate privată __age și o metodă getter get_age. Afișează vârsta folosind metoda getter.
Ieșire: program Python complet

Setarea valorii unei proprietăți private

Modificarea unei proprietăți private funcționează la fel, printr-o metodă setter.

O metodă setter poate și să verifice noua valoare înainte de a o stoca:

Exemplu

Schimbă o proprietate privată printr-o metodă setter:

Prompt
Scrie o clasă Python Person cu metode getter și setter pentru proprietatea privată __age, cu validare în metoda setter.
Ieșire: program Python complet

De ce să folosim încapsularea?

Încapsularea îți oferă mai multe avantaje:

  • Protecția datelor: Datele sunt ferite de modificări accidentale
  • Validare: Valorile noi pot fi verificate înainte de a fi stocate
  • Flexibilitate: Codul intern se poate schimba, iar codul din afara clasei continuă să funcționeze
  • Control: Doar tu decizi cum sunt citite și modificate datele

Exemplu

Protejează o valoare și verific-o cu ajutorul încapsulării:

Prompt
Scrie o clasă Python Student cu proprietatea privată __grade și cu metodele set_grade (cu validare), get_grade și get_status.
Ieșire: program Python complet

Proprietăți protejate

Pentru proprietățile protejate, Python are o convenție: începe numele cu un singur underscore, _:

Notă: Aceasta este doar o convenție, iar Python nu o impune. _ le semnalează pur și simplu celorlalți programatori că proprietatea este destinată uzului intern.

Exemplu

O clasă cu o proprietate protejată:

Prompt
Scrie o clasă Python Person cu o proprietate protejată _salary. Arată că aceasta poate fi totuși accesată.
Ieșire: program Python complet

Metode private

Prefixul cu dublu underscore funcționează și pe metode, făcându-le private:

Notă: O metodă privată se comportă ca o proprietate privată: codul din exterior nu o poate apela direct. Aici, __validate este disponibilă doar pentru alte metode ale clasei.

Exemplu

O clasă cu o metodă privată:

Prompt
Scrie o clasă Python Calculator cu o metodă privată __validate, folosită intern de metoda add.
Ieșire: program Python complet

Name mangling (modificarea numelor)

Name mangling (modificarea numelor) este tehnica pe care o folosește Python pentru a face private proprietățile și metodele.

Un nume care începe cu dublu underscore __ este schimbat discret: Python pune _ClassName în fața lui.

Astfel, __age devine _Person__age.

Notă: Numele modificat îți oferă acces la o proprietate privată (poți să-l folosești), dar ar trebui să eviți asta, pentru că anulează scopul încapsulării.

Exemplu

Uită-te la un nume modificat în acțiune:

Prompt
Scrie o clasă Python Person cu proprietatea privată __age. Acceseaz-o folosind name mangling (modificarea numelor) prin _Person__age.
Ieșire: program Python complet