Jeden zo základných konceptov v objektovo orientované programovanie (OOP) jazyky je dedičnosť. Je to mechanizmus, ktorý vám umožňuje vytvárať hierarchiu tried, ktoré zdieľajú množinu vlastností a metód odvodením triedy z inej triedy. Dedičnosť je schopnosť jednej triedy odvodiť alebo zdediť vlastnosti z inej triedy.
Výhody dedičstva sú:
filmy
Dedičnosť vám umožňuje dediť vlastnosti triedy, t. j. základnej triedy na inú, t. j. odvodenú triedu. Výhody dedičnosti v Pythone sú nasledovné:
- Dobre reprezentuje vzťahy v reálnom svete.
- Poskytuje znovupoužiteľnosť kódu. Nemusíme písať ten istý kód znova a znova. Tiež nám umožňuje pridať do triedy ďalšie funkcie bez toho, aby sme ju upravovali.
- Má tranzitívny charakter, čo znamená, že ak trieda B dedí z inej triedy A, potom všetky podtriedy B automaticky zdedia z triedy A.
- Dedičnosť ponúka jednoduchú a zrozumiteľnú štruktúru modelu.
- Menšie náklady na vývoj a údržbu vyplývajú z dedičstva.
Syntax dedičnosti Pythonu
Syntax jednoduchej dedičnosti v Pythone je nasledovná:
Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body}> Vytvorenie rodičovskej triedy
Rodičovská trieda je trieda, ktorej vlastnosti zdedí podradená trieda. Vytvorme rodičovskú triedu s názvom Osoba ktorý má a Displej spôsob zobrazenia informácií o osobe.
Python3
# A Python program to demonstrate inheritance> class> Person(>object>):> > ># Constructor> >def> __init__(>self>, name,>id>):> >self>.name>=> name> >self>.>id> => id> ># To check if this person is an employee> >def> Display(>self>):> >print>(>self>.name,>self>.>id>)> # Driver code> emp>=> Person(>'Satyam'>,>102>)># An Object of Person> emp.Display()> |
>
>
Výkon:
Satyam 102>
Vytvorenie detskej triedy
Podradená trieda je trieda, ktorá riadi vlastnosti zo svojej nadradenej triedy. Tu Emp je ďalšia trieda, ktorá zdedí vlastnosti triedy Osoba trieda (základná trieda).
Python3
class> Emp(Person):> > >def> Print>(>self>):> >print>(>'Emp class called'>)> > Emp_details>=> Emp(>'Mayank'>,>103>)> # calling parent class function> Emp_details.Display()> # Calling child class function> Emp_details.>Print>()> |
>
>
Výkon:
Mayank 103 Emp class called>
Príklad dedičnosti v Pythone
Pozrime sa na príklad jednoduchej dedičnosti Pythonu, v ktorej podradená trieda dedí vlastnosti svojej nadradenej triedy. V tomto príklade je „Osoba“ nadradenou triedou a „Zamestnanec“ je jej podradená trieda.
Python3
# A Python program to demonstrate inheritance> # Base or Super class. Note object in bracket.> # (Generally, object is made ancestor of all classes)> # In Python 3.x 'class Person' is> # equivalent to 'class Person(object)'> class> Person(>object>):> ># Constructor> >def> __init__(>self>, name):> >self>.name>=> name> ># To get name> >def> getName(>self>):> >return> self>.name> ># To check if this person is an employee> >def> isEmployee(>self>):> >return> False> # Inherited or Subclass (Note Person in bracket)> class> Employee(Person):> ># Here we return true> >def> isEmployee(>self>):> >return> True> # Driver code> emp>=> Person(>'Geek1'>)># An Object of Person> print>(emp.getName(), emp.isEmployee())> emp>=> Employee(>'Geek2'>)># An Object of Employee> print>(emp.getName(), emp.isEmployee())> |
>
>
Výkon:
Geek1 False Geek2 True>
Čo je trieda objektov v Pythone?
Ako Trieda Java Object , v Pythone (od verzie 3. x) je objekt koreňom všetkých tried.
- V Pythone 3.x sú trieda Test (objekt) a trieda Test rovnaké.
- V Pythone 2. x trieda Test(object) vytvára triedu s objektom ako rodičom (nazývaná trieda nového štýlu) a trieda Test vytvára triedu starého štýlu (bez objektového rodiča).
Podtrieda (volajúci konštruktor nadradenej triedy)
Podradená trieda musí identifikovať, ktorá trieda je jej rodičovskou triedou. Môžete to urobiť tak, že v definícii podradenej triedy uvediete názov nadradenej triedy.
Príklad: trieda názov_triedy (názov_nadtriedy)
V tomto príklade „a“ je inštancia vytvorená pre triedu Osoba. Vyvolá __init__() odkazovanej triedy. Vo vyhlásení triedy Osoba môžete vidieť napísaný „objekt“. V Pythone každá trieda dedí zo vstavanej základnej triedy nazývanej „objekt“. Konštruktor, t. j. funkcia „__init__“ triedy sa vyvolá, keď vytvoríme objektovú premennú alebo inštanciu triedy.
Premenné definované v __init__() sa nazývajú premenné inštancie alebo objekty. Preto sú „meno“ a „idčíslo“ objektmi triedy Osoba. Podobne „plat“ a „pošta“ sú objektmi triedy Zamestnanec. Keďže trieda Zamestnanec dedí z triedy Osoba, „meno“ a „identifikačné číslo“ sú tiež objektmi triedy Zamestnanec.
Python3
# Python code to demonstrate how parent constructors> # are called.> # parent class> class> Person(>object>):> ># __init__ is known as the constructor> >def> __init__(>self>, name, idnumber):> >self>.name>=> name> >self>.idnumber>=> idnumber> >def> display(>self>):> >print>(>self>.name)> >print>(>self>.idnumber)> # child class> class> Employee(Person):> >def> __init__(>self>, name, idnumber, salary, post):> >self>.salary>=> salary> >self>.post>=> post> ># invoking the __init__ of the parent class> >Person.__init__(>self>, name, idnumber)> # creation of an object variable or an instance> a>=> Employee(>'Rahul'>,>886012>,>200000>,>'Intern'>)> # calling a function of the class Person using its instance> a.display()> |
>
>
Výkon:
Rahul 886012>
Program Python na preukázanie chyby, ak zabudneme vyvolať __init__() rodiča
Ak zabudnete vyvolať __init__() rodičovskej triedy, potom jej premenné inštancie nebudú dostupné pre podradenú triedu. Nasledujúci kód vytvára chybu z rovnakého dôvodu.
Python3
class> A:> >def> __init__(>self>, n>=>'Rahul'>):> >self>.name>=> n> class> B(A):> >def> __init__(>self>, roll):> >self>.roll>=> roll> object> => B(>23>)> print>(>object>.name)> |
>
>
Výkon :
Traceback (most recent call last): File '/home/de4570cca20263ac2c4149f435dba22c.py', line 12, in print (object.name) AttributeError: 'B' object has no attribute 'name'>
Funkcia super().
The super() funkcia je vstavaná funkcia, ktorá vracia objekty reprezentujúce nadradenú triedu. Umožňuje prístup k metódam a atribútom rodičovskej triedy v podradenej triede.
Príklad: super() funkcia s jednoduchou dedičnosťou Pythonu
V tomto príklade sme vytvorili objekt „obj“ podradenej triedy. Keď sme zavolali konštruktor podradenej triedy ‘Student’, inicializoval dátové členy na hodnoty odovzdané počas vytvárania objektu. Potom pomocou funkcie super() sme vyvolali konštruktor rodičovskej triedy.
Python3
# parent class> class> Person():> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >def> display(>self>):> >print>(>self>.name,>self>.age)> # child class> class> Student(Person):> >def> __init__(>self>, name, age):> >self>.sName>=> name> >self>.sAge>=> age> ># inheriting the properties of parent class> >super>().__init__(>'Rahul'>, age)> >def> displayInfo(>self>):> >print>(>self>.sName,>self>.sAge)> obj>=> Student(>'Mayank'>,>23>)> obj.display()> obj.displayInfo()> |
>
>
Výkon:
Rahul 23 Mayank 23>
Pridanie vlastností
Jednou z funkcií, ktoré poskytuje dedičnosť, je dedenie vlastností nadradenej triedy, ako aj pridávanie nových vlastných vlastností do podradenej triedy. Pozrime sa na to na príklade:
Python3
# parent class> class> Person():> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >def> display(>self>):> >print>(>self>.name,>self>.age)> # child class> class> Student(Person):> >def> __init__(>self>, name, age, dob):> >self>.sName>=> name> >self>.sAge>=> age> >self>.dob>=> dob> ># inheriting the properties of parent class> >super>().__init__(>'Rahul'>, age)> >def> displayInfo(>self>):> >print>(>self>.sName,>self>.sAge,>self>.dob)> obj>=> Student(>'Mayank'>,>23>,>'16-03-2000'>)> obj.display()> obj.displayInfo()> |
>
>
Výkon:
Tu vidíme, že sme do triedy dieťaťa pridali novú vlastnosť, t. j. dátum narodenia (nar.).
Rahul 23 Mayank 23 16-03-2000>
Rôzne typy dedičnosti Pythonu
V Pythone existuje 5 rôznych typov dedičnosti. Sú nasledovné:
- Jediné dedičstvo: Keď podriadená trieda dedí iba od jednej rodičovskej triedy, nazýva sa to jediné dedičstvo. Príklad sme videli vyššie. Viacnásobné dedičstvo : Keď podradená trieda dedí z viacerých rodičovských tried, nazýva sa to viacnásobné dedičstvo.
Na rozdiel od Java, python ukazuje viacnásobnú dedičnosť.
Python3
# Python example to show the working of multiple> # inheritance> class> Base1(>object>):> >def> __init__(>self>):> >self>.str1>=> 'Geek1'> >print>(>'Base1'>)> class> Base2(>object>):> >def> __init__(>self>):> >self>.str2>=> 'Geek2'> >print>(>'Base2'>)> class> Derived(Base1, Base2):> >def> __init__(>self>):> ># Calling constructors of Base1> ># and Base2 classes> >Base1.__init__(>self>)> >Base2.__init__(>self>)> >print>(>'Derived'>)> >def> printStrs(>self>):> >print>(>self>.str1,>self>.str2)> ob>=> Derived()> ob.printStrs()> |
>
>
Výkon:
Base1 Base2 Derived Geek1 Geek2>
- Viacúrovňové dedičstvo: Keď máme vzťah medzi dieťaťom a vnukom. To znamená, že podradená trieda bude dediť od svojej nadradenej triedy, ktorá zasa dedí od svojej nadradenej triedy.
Python3
# A Python program to demonstrate inheritance> # Base or Super class. Note object in bracket.> # (Generally, object is made ancestor of all classes)> # In Python 3.x 'class Person' is> # equivalent to 'class Person(object)'> class> Base(>object>):> ># Constructor> >def> __init__(>self>, name):> >self>.name>=> name> ># To get name> >def> getName(>self>):> >return> self>.name> # Inherited or Sub class (Note Person in bracket)> class> Child(Base):> ># Constructor> >def> __init__(>self>, name, age):> >Base.__init__(>self>, name)> >self>.age>=> age> ># To get name> >def> getAge(>self>):> >return> self>.age> # Inherited or Sub class (Note Person in bracket)> class> GrandChild(Child):> ># Constructor> >def> __init__(>self>, name, age, address):> >Child.__init__(>self>, name, age)> >self>.address>=> address> ># To get address> >def> getAddress(>self>):> >return> self>.address> # Driver code> g>=> GrandChild(>'Geek1'>,>23>,>'Noida'>)> print>(g.getName(), g.getAge(), g.getAddress())> |
>
>
Výkon:
Geek1 23 Noida>
- Hierarchická dedičnosť Z jedného základu možno vytvoriť viac ako jednu odvodenú triedu. Hybridné dedičstvo : Táto forma kombinuje viac ako jednu formu dedičstva. V podstate ide o zmes viac ako jedného typu dedičstva.
Ďalšie podrobnosti nájdete v tomto článku: Typy dedenia v Pythone
Súkromní členovia nadradenej triedy
Nechceme vždy, aby premenné inštancie nadradenej triedy zdedila podradená trieda, t. j. niektoré premenné inštancie nadradenej triedy môžeme nastaviť ako súkromné, ktoré nebudú dostupné pre podradenú triedu.
V dedičnosti Pythonu môžeme premennú inštancie nastaviť ako súkromnú pridaním dvojitého podčiarknutia pred jej názov. Napríklad:
Python3
java reťazec je prázdny
# Python program to demonstrate private members> # of the parent class> class> C(>object>):> >def> __init__(>self>):> >self>.c>=> 21> ># d is private instance variable> >self>.__d>=> 42> class> D(C):> >def> __init__(>self>):> >self>.e>=> 84> >C.__init__(>self>)> object1>=> D()> # produces an error as d is private instance variable> print>(object1.c)> print>(object1.__d)> |
>
>
Výkon :
Tu vidíme, že keď sme sa pokúsili vytlačiť premennú ‚c‘, na konzole sa vytlačí jej hodnota 21. Zatiaľ čo keď sme sa pokúsili vytlačiť „d“, vygenerovala sa chyba. Je to preto, že premenná „d“ je označená ako súkromná pomocou podčiarkovníkov. Nie je k dispozícii pre podradenú triedu „D“, a preto došlo k chybe.
21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'>