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.

class DerivedClassName(BaseClassName):<br />

<br />

.<br />

.<br />

.<br />

<br />

Clasa BaseClassName trebuie să fie definită pentru ca definiţia clasei derivate să fie corectă. În loc de un nume<br />

de clasă puteţi folosi o expresie, acest lucru fiind foarte util atunci când clasa de bază se află într-un alt modul:<br />

class DerivedClassName(modname.BaseClassName):<br />

Atunci când obiectul class pentru clasa derivată, este creat, este memorată şi clasa de bază. Acest mecanism<br />

este folosit pentru a rezolva referirile la atribute: în caz că un atribut nu este găsit în clasa derivată, este căutat şi<br />

în clasa de bază. Regula se aplică recursiv dacă clasa de bază este la rândul ei o clasă derivată.<br />

Instanţierea unei clase se face la fel ca până acum. Dacă este apelată o metodă a unei instanţe, numele metodei<br />

este căutat întâi în definiţia clasei derivate, apoi în definiţia clasei de bază, şi aşa mai departe până când este găsit<br />

un obiect funcţie corespunzător în lanţul de moşteniri.<br />

Clasele derivate pot suprascrie metode ale clasei de bază. Deoarece o metodă nu dispune de nici un privilegiu<br />

atunci când apelează o altă metodă a aceluiaşi obiect, o metodă a clasei de bază care apelează o altă metodă,<br />

definită de asemenea în clasa de bază, poate să apeleze de fapt o metodă suprascrisă de clasa derivată (pentru<br />

programatorii C++ putem spune că toate metodele din <strong>Python</strong> sunt virtuale).<br />

O astfel de metodă suprascrisă poate chiar să extindă metoda de bază, în loc de a o înlocui. Există o cale simplă<br />

de a apela direct o metodă a clasei de bază : ClasădeBază.metodă(self.argumente).<br />

Acest lucru poate fi foarte util chiar şi utilizatorilor(clienţilor) unei clase.<br />

9.5.1 Moştenirea multiplă<br />

<strong>Python</strong> pune la dispoziţia programatorilor şi o formă de moştenire multiplă. O definiţie de clasă derivată din mai<br />

multe clase de bază arată în felul următor:<br />

class DerivedClassName(Base1, Base2, Base3):<br />

<br />

.<br />

.<br />

.<br />

<br />

Regula după care sunt căutate atributele este următoarea: dacă un atribut nu este definit în clasa derivată atunci<br />

acesta este căutat în definiţia clasei Base1 şi în toate clasele de la care aceasta moşteneşte, apoi este căutat în<br />

Base2 şi în Base3 după aceleaşi reguli. Putem rezuma această regulă în felul următor: “întâi în adâncime, şi<br />

de la stânga la dreapta”. (Avantajele şi dezavantajele acestei reguli pot fi discutate, însă trebuie să fie foarte clar<br />

pentru toată lumea că o astfel de regulă este absolut necesară, fapt suficient de evident).<br />

Este suficient de clar că folosirea mecanismului de moştenire multiplă va crea mari probleme de întreţinere,<br />

deoarece în <strong>Python</strong> conflictele ce pot apărea între nume sunt evitate numai prin convenţii. O problemă cunoscută<br />

apare atunci când o clasă moşteneşte de la două clase care la rândul lor sunt derivate dintr-o singură clasă.<br />

Deşi este destul de simplu să ne imaginăm ce se va întâmpla în acest caz, nu este clar că regulile vor fi de folos<br />

pentru clarificarea situaţiei.<br />

9.5. Moştenirea 63

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

Saved successfully!

Ooh no, something went wrong!