28.01.2015 Views

Tutorial Python - Starship

Tutorial Python - Starship

Tutorial Python - Starship

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

9.2 Domenii de vizibilitate (Scopes) şi domenii de definiţie a numelor(Name<br />

Spaces)<br />

Definiţiile claselor manipulează într-un mod foarte interesant domeniile de definiţie a numelor, şi o foarte bună<br />

înţelegere a modului de funcţionare a domeniilor de vizibilitate şi de definiţie a numelor este foarte impotantă.<br />

Înţelegerea acestor mecanisme este foarte importantă şi se va dovedi foarte utilă oricărui programator avansat<br />

<strong>Python</strong>.<br />

Să începem cu câteva definiţii.<br />

Un domeniu de definiţii a numelor este o “hartă” de legături între nume şi obiecte. În momentul de faţă aceste<br />

domenii sunt implementate folosind dicţionare, dar metodele de implementare pot fi schimbate pe viitor. Exemple<br />

de astfel de domenii sunt: domeniul numelor predefinite, domeniul numelor globale dintr-un modul, domeniul<br />

numelor locale creat la apelarea unei funţii, etc. Într-un anumit sens atributele unui anume obiect formează un<br />

domeniu de definiţie. Un lucru foarte important de ştiut este acela că între două nume existente în două domenii<br />

diferite nu există absolut nici o legătură. Din această cauză două module pot defini o funcţie cu aceeaşi denumire<br />

fără a se crea confuzie.<br />

Un atribut este orice nume care urmează unui punct, de exemplu în expresia z.real, real este un atribut al<br />

obiectului z. Într-un sens strict, referinţele la numele definite într-un modul sunt de fapt referinţe la atribute ale<br />

modulului: în expresia modul.funcţie, modul este modulul iar funcţie este un atribut al modulului.<br />

Numele globale ale modulului şi atributele modulului se află în acelaşi domeniu de definiţie al numelor.(Există o<br />

singură excepţie. Modulele au un atribut nemodificabil (read-only) “secret”: __dict__, în care se află domeniul<br />

de definiţie al numelor ce aparţine modulului. __dict__ este un atribut dar nu este un nume global.)<br />

Atributele pot fi nemodificabile(read-only) sau modificabile(writeable). Atributele unui modul sunt modificabile:<br />

se poate folosi o secvenţă de genul: ‘modul.răspuns = 42’. Atributele modificabile pot fi de asemenea şterse<br />

folosind operatorul del. De exemplu ‘del modul.răspuns’ va elimina atributul răspuns din obiectul<br />

denumit modul.<br />

Domeniile de definiţie a numelor sunt create la momente de timp diferite şi au perioade de viaţă diferite. Domeniul<br />

care conţine numele predefinite este creat odată cu pornirea interpretorului <strong>Python</strong> şi nu este şters niciodată.<br />

Domeniul numelor globale definite într-un modul este creat atunci când este încărcată definiţia modulului şi este<br />

distrus, de obicei, tot în momentul în care interpretorul este închis. Instrucţiunile executate la primul nivel al<br />

interpretorului fie dintr-un script, fie interactiv, fac parte dintr-un modul numit __main__. Numele predefinite<br />

se află în domeniul __builtin__.<br />

Domeniul de definiţie a numelor pentru o funcţie este creat odată cu apelul funcţiei şi este şters odată cu terminarea<br />

funcţiei, fie prin return, fie dacă acesta generează o excepţie netratată. Bineînţeles că apeluri recursive<br />

generează mai multe domenii de definiţie.<br />

Un domeniu de vizibilitate este o regiune a unui program <strong>Python</strong> în care un anumit domeniu de definiţie a numelor<br />

este accesibil. Accesibil înseamnă că o anumită referinţă la un nume va genera o căutare în domeniul de definiţie<br />

al acelui modul, despre care spunem că este accesibil.<br />

Domeniile de vizibilitate sunt determinate static şi sunt folosite dinamic. În timpul execuţiei există exact trei<br />

domenii de vizibilitate (exact trei domenii de definiţie sunt direct accesibile): primul, “cel mai adânc”, conţine<br />

numele locale, cel de-al doilea conţine numele globale ale modulului curent, iar cel de-al treilea, “cel mai de sus”,<br />

care este şi ultimul în care se caută un nume, dacă în celelalte căutarea nu a avut succes. Cel de al treilea nivel<br />

conţine numele predefinite.<br />

De obicei, “cel mai adânc” domeniu de vizibilitate este cel al funcţiei care este executată. În exteriorul unei funcţii,<br />

acest domeniu este identic cu al doilea domeniu (cel din mijloc), în care se află accesibile definiţiile modulului.<br />

Domeniul de vizibilitate global al unei funcţii definite într-un modul este domeniul de definiţii al respectivului<br />

modul, indiferent de unde, sau cu ce alias este apelată respectiva funcţie. Pe de altă parte căutarea unui anumit<br />

nume este realizată dinamic, în timpul execuţiei. Cu toate astea definiţia limbajului evoluează către o “rezolutie”<br />

a numelor statică, în timpul compilării. În concluzie nu vă bazaţi prea tare pe varianta dinamică. Deja variabilele<br />

locale sunt determinate static.<br />

O caracteristică a limbajului <strong>Python</strong> este aceea că atribuirile au loc în primul domeniu de vizibilitate(“cel mai de<br />

58 Capitolul 9. Clase

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!