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