Crearea de clase de arbori
Capitolul 22. OOP: imagine de ansamblu
de ce acest model se numește orientat pe obiect - există întotdeauna obiectul peste care se efectuează acțiuni. Mai multe EeJ listichnom exemplu, am putea numi o metodă numită giveRaise, atașată ca un atribut al clasei Angajat, - apel la această metodă ar fi lipsită de sens fără a angajatului care dă salariul pe oră.
După cum vom vedea mai târziu, Python transmite metodă implică o instanță specială a primului argument, în conformitate cu cu invitații numite auto. De asemenea, știm că metode pot tine atât prin elemente de legare (de exemplu, bob.giveRaise ()) și Th tăiat clase (de exemplu, Employee.giveRaise (bob)), ambele care formează ur rayut același rol în nostru scenarii. Pentru a vedea cum Meto dy ia instanțele lor pretinse, trebuie să ia în considerare exemple de programare.
În ciuda abstractul conversațiilor noastre, cu toate acestea, pentru vulpile Ku tuturor acestor idei este un cod adevărat. Noi crea copaci și obiecte în ele folosind clasele instrucțiuni de clasă și de apel, care mai târziu ne vom uita la mai detaliat. Într-un cuvânt:
• Fiecare clasă de instruire creează o nouă clasă de obiecte.
• De fiecare dată când o clasă este numit, se creează un nou obiect zemplyara echiv.
• Copiile sunt asociate automat cu clasele din care au fost create.
• Clasele sunt asociate cu superclasele lor enumerate în paranteză, în termeni împerecheat instrucțiuni clasa antet - ordinea listei determină ordinea de copac.
Pentru a crea arborele prezentat în Fig. 22.1, de exemplu, am putea folosi următorul cod (aici am coborât clase zatsiyu în aplicare):
# Asociate cu clasele lor
Aici vom construi o clasă de obiecte copac, urmând trei clasa TION instruk, și două copii ale obiectului prin apelul clasa C1 de două ori, dacă UE ar fi că a fost o caracteristică obișnuită. Copii amintesc clasa de Koto cerned au fost create, iar Clasa C1 este conștient de superclasa.
Din punct de vedere tehnic, acest exemplu folosește ceea ce se numește moștenire multiplă. ceea ce înseamnă că nici o clasă de tac are mai mult de o superclasa dintr-o clasă în copac.
OOP de la o inaltime de 30.000 de picioare
Limbajul Python atunci când clasa de instrucțiuni enumerable între paranteze rotunde Leno mai mult de o superclasa (în cazul C1 clasa în cel puțin) ordinea lor determină ordinea de la stânga la dreapta ka punctele de interes atributele în superclase.
Datorită caracteristicilor de căutare în arborele de moștenire are valori mari de care dintre obiectele îmbinate unul sau un alt atribut - astfel definit prin domeniul său de aplicare. Atribute Alăturați-vă mye la instanțe aparțin numai acestui cadre exemplu specifice, dar atribute care se atașează la o clasă, împărtășesc o zâmbitori toate subclasele și instanțele. Mai târziu, vom examina în detaliu codul care efectuează atribute de conexiune la aceste obiecte. Putem vedea că:
• atribute în general atașate la clase folosind instruk țiilor de atribuire în instruirea în clasă, și nu în imbricat def instrucțiunile care îl însoțesc, definind funcția.
• Atributele sunt de obicei atașate la o instanță utilizând valori la argumentul svaivaniya special, cu numele de sine, re ca dată de funcții în cadrul claselor.
De exemplu, clasele definesc comportamentul funcțiilor lor schyu instanțe Pomo pentru a instrui def în instruirea în clasă. Deoarece astfel de instrucțiune def imbricată se efectuează la numele svaivanie într-o clasă, acestea sunt atașate la obiecte sub formă de clase și atribute vor fi moștenită de toate instanțele și subclase:
instrucțiune def sintaxă în acest context - complet normal. Din punct de vedere functional, atunci când declarația def apare în cadrul instruirii de clasă, ca în acest exemplu, este de obicei Me + Todd a sunat și ia automat un prim argument special, cu instrumentul IME este auto, care conține o referire la copia în mână. 1
Deoarece clasele sunt mori capabile să producă un set de cazuri, metodele lor de obicei folosesc acest obținute
1 Dacă vreodată va trebui să utilizați limbajul C ++ sau Java, veți înțelege cu ușurință că eul în numele Python - este la fel ca un pointer la acest lucru, dar în Python argument de sine este întotdeauna utilizat în mod explicit la ETS lat de manipulare mai multe atribute evidente .
Capitolul 22. OOP: imagine de ansamblu
automată, argument de sine pentru a schimba sau de un caz particular al valorilor atribut, care este procesat casa Meto. În codul anterior fragmentul nume de sine este utilizat etsya pentru a salva numele unui angajat într-un anumit caz.
Ca simple variabile, clase, și cazuri de atribute nu sunt anunțate în prealabil și apar atunci când au efectuat mai întâi atribuirea de valori. Atunci când metoda atribuie o valoare a atributului folosind numele de sine, el creează astfel o instanță a atributului pe mersul pe jos în copac clase de nivel inferior (adică, într-una dintre dreptunghiurile), deoarece numele este automat de sine se referă la o instanță a Tyva GRAIN.
De fapt, datorită faptului că toate obiectele din arborele de clasă - aceasta este doar un spațiu de nume de obiecte, putem primi sau stabilim oricare dintre atributele lor, folosind denumirile corespunzătoare. De exemplu, C1.setname aceeași expresie este valabilă ca I1.setname, cu condiția ca C1 și I1 sunt numele în codul VD Mosti.
În prezent clasă C1 nu se adaugă un atribut nume ekzemp lyaram până când metoda setName se numește. De fapt, încercarea de a numi Obra titsya I1.name I1.setname up rezultate apel într-o eroare, informând numele nedefinit. În cazul în care o clasă trebuie să se asigure că atributul cum ar fi numele, va fi întotdeauna la care nu apar în copiile, atunci acest atribut trebuie să fie creat pe scena clasei, așa cum se arată mai jos:
În acest caz, interpretul Python solicită în mod automat o metodă numită __init__ de fiecare dată când creați o instanță a clasei. Noua instanță va fi transferat la metoda __init__ ca primul argument al sinelui, precum și orice valori care sunt enumerate în paranteze la apelarea clasei, va fi transferat la a doua și următoarele argumente din spatele acestuia. Ca urmare, inițializarea de copii se va desfășura în momentul creării lor, fără a fi nevoie pentru a apela metodele publicitare ditional.
Metoda __init__ este cunoscut ca un constructor. deoarece pornește de la instanță faza de proiectare. Această metodă este reprezentativă pentru o clasă mare de metode numite metoda E + Reacoperirea. Detalii despre aceste metode vor fi considerate în următoarele capitole. Astfel de metode sunt moștenite în arborele de clasă, ca de obicei, și numele lor încep și se termină cu două
OOP de la o inaltime de 30.000 de picioare
subliniază, pentru a sublinia lor speciale a desemnat. Interpretorul Python le ridică automat atunci când ekzemp lyary care le sprijină, sunt implicate în tranzacțiile relevante, iar acestea sunt în mare parte simplă alternativă la provocările todov UI. Mai mult decât atât, ele sunt opționale: în cazurile în absența acestora operațiunile corespunzătoare nu sunt acceptate.
De exemplu, pentru a realiza intersecția dintre seturi, clasa poate pre dusmotret de punere în aplicare Intersectarea metodă sau supraîncărca Descriind logica operei sale într-o metodă numită __and__. Din moment ce au fost utilizați copii ale declarațiilor face mai mult ca built-in tipuri, vă permite să furnizeze anumite clase neprotivore chivy și interfața naturală și să fie compatibile cu NYM codul software care include un număr de operații pe un obiect E built-in tipuri.
OOP - este reutilizarea codului
Aici, în principiu, și toate descrierile OOP în limba Python (cu excepția unor caracteristici sintactice). Desigur, prezența OEP „există nu numai moștenire. De exemplu, operatorul Supraîncărcarea poate fi utilizat mult mai larg decât cele descrise până în prezent - clase mo gut furnizează propriile operațiuni, cum ar fi dos muții elementelor prin indexul lor, obținând valorile atributelor, tu de apă și multe altele. Dar, în general vorbind, OEP pune în aplicare de căutare atribute camarad în copaci.
Atunci de ce avem nevoie pentru a se arunca cu capul în labirintul de a crea un arbore de obiecte, și caută-le? Ai nevoie pentru a obține o anumită experiență și de a vedea cum în cazul în care clasele utilizate susțin posibilitatea de reutilizare a codului od Bami, care nu sunt disponibile în alte componente software. Vom folosi clase, vom programa, personalizarea software-ul de scriere, mai degrabă decât de a schimba codul existent sau scrie un nou cod pentru fiecare proiect nou.
Dintr-un punct de vedere fundamental, clasele - este de fapt doar un pachete și alte funcții, nume care seamănă cu module în multe feluri. Cu toate acestea, căutarea automată atributele în arborele Nasledova Niya, pe care îl obține prin utilizarea oferă posibilități de adaptare a software-ului mai mare decât este posibil cu module și funcții clase. Mai mult decât atât, clasele sunt o structură convenabilă oferind un aranjament compact de cod executabil și variabile care ajută la depanare.
De exemplu, metodele - sunt caracteristici comune cu un prim argument special, astfel încât să putem emula anumite caracteristici ale comportamentului lor, trecând manual obiecte să se ocupe funcția de obicei
Capitolul 22. OOP: imagine de ansamblu
tsiyam. Cu toate acestea, metodele implicate în moștenirea claselor ne permite să se adapteze în mod natural software-ul existent este necesară coacere, crearea de noi subclase care definesc metode noi, mai degrabă decât să se schimbe codul existent. Noe similitudine este imposibilă în cazul modulelor și funcții.
Ca un exemplu, să presupunem că sunteți atras de punerea în aplicare a unei aplicații de baze de date, care stochează informații despre angajați. Ca un programator, folosind singularitate orientat-obiect Python, ai putea începe cu punerea în aplicare a unei superclase comune care definește comportamentul comun tuturor angajaților categoria riu din organizație:
# Apel versiunea metodei pentru acest obiect
Acesta este un alt tip de polimorfism - o idee care a fost pus în fața capitolului 4 și re-discutate în capitolul 15. Amintiți-vă, polimorfismul înseamnă că sensul operațiunii depinde de obiectul pe care se execută. Aici metoda computeSalary este definită în căutarea de ho în fiecare obiect în arborele de moștenire înainte de a-l va fi numit. În alte aplicații, polimorfismul poate utiliza, de asemenea, pentru a ascunde IP (de exemplu, încapsulare) diferențele Institutul terfeysov. De exemplu, un program care se ocupă de fluxul de date pe care se poate lucra cu obiecte care au de intrare și de ieșire metode, nu le pese de faptul că aceste metode de fapt, nu:
procesor def (cititor, convertor, scriitor): în timp ce 1:
date = cititor. citit () în cazul în care nu date: date de pauză = convertor (date) scriitor. write (date)
Trecerea instanțe ale claselor cu interfață necesară UI todami citească și să scrie, specializate pentru diferite surse de date, putem folosi aceeași funcție de procesor pentru a lucra cu orice sursă de date, atât existente și cele care apar în viitor:
1 Vă rugăm să rețineți că lista companiei în acest exemplu ar putea salva de camping într-un fișier, pentru a asigura stocarea permanentă a bazei de date de informații TION angajaților (folosind modulul pickle, introdus în capitolul 9
„Utilizarea fișierelor“ secțiunea). În plus, compoziția include un modul Python timp de rafturi, care ar putea permite să păstreze cazuri de clase
fișiere cu acces prin cheie - dezvoltare față, sistemul ZODB permite să se realizeze același lucru, dar are un suport mai bun pentru baze de date orientate pe obiecte pentru uz comercial.
Capitolul 22. OOP: imagine de ansamblu
În plus, datorită faptului că punerea în aplicare internă a citire și de scriere metode a fost împărțit tipuri de surse de date, puteți schimba fără a atinge acest cod, similar cu cel pe care le utilizează. De fapt, funcția de procesor în sine poate fi clasa logica de punere în aplicare a funcției de conversie convertor care poate moșteni subclase, și care permite de a încorpora instanțe care operează pe citire și scriere, în conformitate cu principiul compoziției CSM (denumită în continuare această parte este prezentată ca EeJ lizuetsya ).
Când te obișnuiești cu programul în acest stil (adaptare a software-ului a), veți găsi, începe să scrie un nou gram pro că cea mai mare problema a fost deja pusă în aplicare, iar per cabana, practic se reduce la, în scopul de a ridica perklassy Su existente, care să pună în aplicare comportamentul necesar programelor dumneavoastră UI. De exemplu, poate altcineva, pentru un program complet diferit, a scris deja clasa Angajat, Reader și scenaristul acestui exemplu. În acest caz, puteți utiliza deja preparate despre codul grammnym „pentru acest lucru.“
În practică, în multe domenii de aplicare, puteți obține sau cumpăra o colecție superclasă, cunoscut sub numele de platformă. în Coto ryh sarcini comune implementate Prog clasa-based, gata de utilizare în niyah dvs. Ap. Astfel de platforme pot oferi interfețe la bazele de date de date care protocoalele de testare, instrumente pentru crearea Face între grafice și așa mai departe. D. În mediul platformei va fi de multe ori suficient pentru a crea o subclasă a adăuga una sau două din metoda lui și lucrarea Elementele de bază ale Naya vor fi efectuate de clase platforma dispusă în E de mai sus în arborele de moștenire. Programarea într-o lume OOP - este doar o chestiune de asamblare cod deja depanat și configurați-l scriind propriile subclase.
Desigur, faptul de a înțelege modul de utilizare a claselor pentru Hon zheniya acest ideal orientat-obiect, va fi nevoie de timp. practica OOP atrage după sine o cantitate mare de pre-inginerie, care sunt înțelese în avantaje majore sunt obținute din utilizarea claselor; în acest scop, programatori a început să fie o listă de soluții comune în OEP, cunoscut sub numele de modele de design - pentru a ajuta la rezolvarea problemelor de proiectare. În acest caz, orientat-obiect de cod grammny despre limbajul atât de simplu încât, în sine, nu este un obstacol în dezvoltarea OEP. Pentru a verifica acest lucru, trebuie să vă mutați la capitolul 23.
Pentru a continua descărcarea aveți nevoie pentru a asambla o imagine: