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ú Polygon
definovanú 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 Triangle
vš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 Triangle
osobitne, 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, True
ak 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