Dedičnosť v Pythone (s príkladmi)

Dedenie nám umožňuje definovať triedu, ktorá preberá všetky funkcie z nadradenej triedy a umožňuje nám pridávať ďalšie. V tomto tutoriále sa naučíte používať dedičnosť v Pythone.

Video: Dedičnosť Pythonu

Dedenie v Pythone

Dedičnosť je výkonná funkcia v objektovo orientovanom programovaní.

Týka sa to definovania novej triedy s malou alebo žiadnou úpravou existujúcej triedy. Nová trieda sa nazýva odvodená (alebo podradená) trieda a tá, z ktorej dedí, sa nazýva základná (alebo nadradená) trieda .

Syntax dedičnosti Pythonu

 trieda BaseClass: telo triedy základnej triedy DerivedClass (BaseClass): telo odvodenej triedy

Odvodená trieda dedí funkcie od základnej triedy, do ktorej je možné pridávať nové funkcie. To má za následok opätovnú použiteľnosť kódu.

Príklad dedenia v Pythone

Na ukážku použitia dedičstva si vezmime príklad.

Polygón je uzavretá postava s 3 alebo viacerými stranami. Povedzme, máme triedu nazvanú Polygondefinovanú nasledovne.

 class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = (0 for i in range(no_of_sides)) def inputSides(self): self.sides = (float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)) def dispSides(self): for i in range(self.n): print("Side",i+1,"is",self.sides(i))

Táto trieda má dátové atribúty na ukladanie počtu strán n a veľkosti každej strany ako zoznamu nazývaného strany.

inputSides()Metóda berie v rozsahu každej strane a dispSides()zobrazí tieto dĺžky strán.

Trojuholník je mnohouholník s 3 stranami. Môžeme teda vytvoriť triedu s názvom Triangle, ktorá dedí z Polygónu. Toto sprístupňuje všetky atribúty triedy Polygon pre triedu Triangle.

Nie je potrebné ich znova definovať (opätovné použitie kódu). Trojuholník je možné definovať nasledovne.

 class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # calculate the semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('The area of the triangle is %0.2f' %area)

Trieda Trianglevšak má novú metódu findArea()na vyhľadanie a vytlačenie oblasti trojuholníka. Tu je ukážka série.

 >>> t = Triangle() >>> t.inputSides() Enter side 1 : 3 Enter side 2 : 5 Enter side 3 : 4 >>> t.dispSides() Side 1 is 3.0 Side 2 is 5.0 Side 3 is 4.0 >>> t.findArea() The area of the triangle is 6.00

Vidíme, že aj keď sme metódy ako inputSides()alebo dispSides()pre triedu nedefinovali Triangleosobitne, dokázali sme ich použiť.

Ak sa atribút nenájde v samotnej triede, hľadanie pokračuje do základnej triedy. Toto sa opakuje rekurzívne, ak je základná trieda sama odvodená od iných tried.

Prepísanie metódy v Pythone

Vo vyššie uvedenom príklade si všimnite, že __init__()metóda bola definovaná v obidvoch triedach, Triangle aj Polygon. Keď k tomu dôjde, metóda v odvodenej triede má prednosť pred metódou v základnej triede. To znamená, že __init__()v Trojuholníku dostane prednosť pred __init__Mnohouholníkom.

Všeobecne pri prepísaní základnej metódy máme tendenciu definíciu skôr rozširovať, než ju jednoducho nahrádzať. To isté sa deje volaním metódy v základnej triede z tej v odvodenej triede (volanie Polygon.__init__()z __init__()in Triangle).

Lepšou možnosťou by bolo použitie vstavanej funkcie super(). Je super().__init__(3)teda ekvivalentný Polygon.__init__(self,3)a uprednostňuje sa. Ak sa chcete dozvedieť viac informácií o super()funkcii v Pythone, navštívte funkciu Python super ().

Dve vstavané funkcie isinstance()a issubclass()slúžia na kontrolu dedičnosti.

Funkcia sa isinstance()vráti, Trueak je objekt inštanciou triedy alebo iných tried z nej odvodených. Každá trieda v Pythone dedí zo základnej triedy object.

 >>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True

Podobne issubclass()sa používa na kontrolu dedičnosti triedy.

 >>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True

Zaujímavé články...