Clase - Limba tutorial Python 3

Datorită mecanismului de clasă Python în limba cu un minim de nouă sintaxă și semantică se adaugă abilitatea de a crea clase. Acest amestec a fost mecanisme de clasă împrumutate din C ++ si Modula-3. Ca și în cazul modulelor, în Python clase nu stabilesc o barieră absolută între definiție și programator, bazându-se mai mult pe acuratețea și politețea acestora din urmă - că nu este „rupt în definiția“. Cele mai importante caracteristici ale claselor, cu toate acestea, să conțină toate puterile posibile: mecanismul de moștenire clasă suportă mai mulți strămoși pentru o clasă, o clasă derivată poate suprasolicita orice metode de strămoș sau strămoșii acestuia, și orice metodă poate determina metoda sa strămoș același nume. Obiectele pot conține un număr arbitrar de date închise (private).

În terminologia C ++, membrii clasei (inclusiv membrii date) sunt, de obicei deschise (public) (cu excepția variabilelor private sunt descrise mai jos.), Și toate funcțiile de membru - virtuale. Nu există constructori și destructori speciale. La fel ca în Modula-3, există o scurtă referire la opoziție membrii din metodele sale: funcția de metodă este definită cu primul argument care descrie în mod explicit obiectul pe care este transmis în mod implicit în apelul. Ca și în Smalltalk, clasele de sine sunt obiecte, deși în sens mai larg: în Python, toate tipurile de date - obiecte. Aceasta oferă semantica pentru importul și redenumirea. Spre deosebire de C ++ si Modula-3 tipuri de valori pot fi folosite ca strămoși pentru a extinde capacitatea de utilizare. Mai mult, la fel ca în C ++, dar nu ca în Modula-3, majoritatea încorporate operatori cu sintaxă specială (operatori matematici, indexare, etc.) pot fi înlocuite pentru instanțele de clasă.

Câteva cuvinte despre terminologie

Ocolind restul lumii au susținut terminologia aplicabilă pentru a vorbi despre clase, în acest caz, voi vorbi în termeni de C ++ și Smalltalk. (Aș prefera să utilizeze limba Modula-3 termeni, deoarece Python este mai aproape de semantica sa orientate obiect decât la C ++, dar cred că puțini cititori au auzit de ea.)

Obiectele au identitate, și un singur obiect poate fi conectat de mai multe nume (în mai multe domenii). Această practică este în alte limbi cunoscute sub numele de combinația de nume (aliasing). La prima vedere, combinația în Python discret, și pot fi ignorate fără consecințe în timpul funcționării cu principalele tipuri imuabile (numere, siruri, tupluri). Cu toate acestea, numele combinației de influențe asupra semantica software-ului de cod Python, care lucrează cu obiecte modificabile: liste, dicționare, și cele mai multe tipuri de a descrie natura în afara programului (fișiere, ferestre, etc.). De obicei, o astfel de practică este considerată a fi utilă ca alias-uri acționează ca semne și, probabil, chiar depășesc capacitățile lor. De exemplu, transferul obiectului - o operațiune ieftină, deoarece punerea în aplicare a numai un pointer este trecut. Dacă funcția modifică trecut ca un argument pentru un obiect, acesta va fi vizibil și la locul de apel. Datorită acestui fapt, a pierdut necesitatea două mecanisme diferite argumente de trecere.

numele câmpurilor de vizibilitate și spațiu în Python

Înainte să luați clasele aveți nevoie pentru a obține o idee despre regulile de aplicare în Python. definiții clasă de namespace face câteva trucuri inteligente. Pentru a înțelege pe deplin ceea ce se întâmplă, trebuie să știți despre principiile de domenii și namespace. Această cunoaștere nu va interfera cu orice programator profesionist în Python.

Să începem cu câteva definiții.

Spațiu de nume (namespace) - un set de link-uri de nume de obiecte. În momentul de față, majoritatea sunt implementate spațiile de nume ca dicționare Python, dar nu insista pe acest lucru (dacă numai asupra performanței): eventual în implementarea viitoare a schimbării. Exemple de namespaces: un set de built-in nume (funcții cum ar fi ABS () și nume de excepție încorporate); nume la nivel mondial într-un modul; nume locale într-un apel de funcție. Cel mai important lucru să știți despre namespace - este că nu există absolut nici o relație între nume în diferite spații de nume, de exemplu, două module diferite pot fi nici o problemă pentru a determina funcția de «maximiza», ca și modulele, utilizatorii vor folosi numele modulului ca prefix .

Atributele de intrare pot fi dezactivate (atribut read-only atribut. numai pentru citire) sau permis (atribut reinscriptibile. atribut scriptibile). În acest ultim caz, atribuirea atributelor este posibil. Atributele unui modul inscriptibil: puteți scrie „modname.the_answer = 42“. Atributele reinscriptibile pot fi șterse del operatorului. De exemplu, codul „del modname.the_answer“ elimina atributul r˘aspuns al unui obiect cu numele modname.

Spațiul de nume local, este creat atunci când funcția este numit și se elimină atunci când funcția returnează sau ridică o excepție, în termen de nu-l interceptat. (De fapt, cel mai bun mod de a explica ceea ce se întâmplă cu adevărat, ar fi „uitarea“). Desigur, generație recursiv au propriul lor spațiu de nume fiecare.

În ciuda faptului că domeniul de aplicare determinat static, acestea sunt utilizate în mod dinamic. În orice moment în timpul executării, există cel puțin trei domenii ale căror imbricate namespace sunt disponibile direct: domeniul de aplicare cel mai interior (pentru ea este căutată în primul rând) conține numele locale; Spațiu de nume a tuturor funcțiilor cuiburi [Codul], căutați care începe cu cel mai apropiat de îngrădire [cod] domeniul de aplicare; domeniu de aplicare gama medie pe ea ruleaza de lângă căutare și conține numele globale ale modulului curent; și domeniul de aplicare ultraperiferice (lista finală) - acesta este spațiul de nume care conține nume de built-in.

Dacă numele este definit la nivel global, atunci toate referințele și sarcinile merge direct în gama medie domeniul de aplicare care conține nume de module la nivel mondial. Pentru a modifica legarea pentru toate variabilele găsite în afara domeniului de aplicare cel mai interior, puteți utiliza operatorul nelocal; în cazul în care această variabilă nu este declarată ca nelocal. acesta este utilizat numai pentru citire (încercare de a scrie o valoare unei variabile creează o nouă variabilă locale în domeniul de aplicare cel mai interior, lăsând variabila nume identice la exterior neschimbat).

De obicei, domeniul de aplicare locală face referire denumirile locale ale curentului (la nivelul textului) funcția. Dincolo de funcțiile domeniului de aplicare locală face trimitere la același spațiu de nume ca și domeniul de aplicare la nivel mondial: spațiul de nume de modul. definiții de clasă sunt plasate în domeniul de aplicare locală un alt spațiu de nume.

Este important să realizăm că domeniile de aplicare sunt limitate la nivel textual: domeniul de aplicare funcția globală, definită într-un modul este spațiul de nume al acestui modul, indiferent de unde sau de ce nume a fost numit această funcție. Pe de altă parte, căutarea efectivă pentru numele se face în mod dinamic, în timpul rulării. Fie că aceasta poate, limba evoluează spre rezolvare de nume statice (la compilare), astfel încât nu se bazează pe rezoluția de nume dinamic. (De fapt, variabilele locale sunt deja determinate static.)

Trucul specială în Python este faptul că - cu condiția ca în acest domeniu nu include operatori globali sau nonlocale - Naming întotdeauna intră în domeniul de aplicare cel mai intim. Atributii nu copia date și numai nume asociate cu obiecte. Același lucru este valabil și pentru ștergeri: operatorul „del x“ elimină asocierea de x spațiul de nume de referință în domeniul de aplicare locală. De fapt, toate operațiunile sunt introducerea de noi nume folosesc domeniul de aplicare locală: în special, declarațiile de import și definiții de funcții leagă modulul sau numele funcției în domeniul de aplicare locală, respectiv. (Pentru a specifica o variabilă specială, acesta trebuie să fie plasat în domeniul de aplicare la nivel mondial, declarația globală poate fi utilizată.)

Declarație globală poate fi utilizată pentru a declara anumite variabile ca legate de domeniul de aplicare la nivel mondial și indică faptul că mutarea lor ar trebui să apară în ea; Operatorul nelocal marchează ca variabile legate de domeniul de aplicare înconjurătoare și indică faptul că mutarea lor ar trebui să apară în ea.

EXEMPLU domenii de vizibilitate și namespaces

Iată un exemplu care arată modul în care se poate referi la diferite domenii de aplicare și modul în care spațiile de nume și la nivel mondial și nelocal afectează legarea variabilei.

ieșire codul din exemplul este după cum urmează: