Dědičnost nám umožňuje definovat třídu, která přebírá všechny funkce z nadřazené třídy a umožňuje nám přidat další. V tomto kurzu se naučíte používat dědičnost v Pythonu.
Video: Python Inheritance
Dědičnost v Pythonu
Dědičnost je výkonná funkce v objektově orientovaném programování.
Odkazuje na definování nové třídy s malou nebo žádnou úpravou stávající třídy. Nová třída se nazývá odvozená (nebo podřízená) třída a ta, ze které dědí, se nazývá základní (nebo nadřazená) třída .
Syntaxe dědičnosti Pythonu
třída BaseClass: Tělo třídy základní třídy DerivedClass (BaseClass): Tělo odvozené třídy
Odvozená třída dědí funkce ze základní třídy, kde do ní lze přidávat nové funkce. To má za následek opětovné použití kódu.
Příklad dědičnosti v Pythonu
Abychom demonstrovali použití dědičnosti, vezměme si příklad.
Mnohoúhelník je uzavřená postava se 3 nebo více stranami. Řekněme, že máme třídu nazvanou Polygon
definovanou následovně.
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))
Tato třída má datové atributy pro uložení počtu stran n a velikosti každé strany jako seznam s názvem strany.
inputSides()
Metoda bere v rozsahu každé straně a dispSides()
zobrazí tyto délky stran.
Trojúhelník je mnohoúhelník se 3 stranami. Můžeme tedy vytvořit třídu zvanou Triangle, která dědí z Polygonu. Díky tomu jsou všechny atributy třídy Polygon dostupné třídě Triangle.
Nepotřebujeme je znovu definovat (opětovné použití kódu). Trojúhelník lze definovat následovně.
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)
Třída Triangle
má však novou metodu findArea()
k vyhledání a tisku oblasti trojúhelníku. Zde je ukázka běhu.
>>> 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 i když jsme metody jako inputSides()
nebo dispSides()
pro třídu nedefinovali Triangle
samostatně, dokázali jsme je použít.
Pokud atribut není nalezen v samotné třídě, hledání pokračuje do základní třídy. Toto se rekurzivně opakuje, pokud je základní třída sama odvozena z jiných tříd.
Přepsání metody v Pythonu
Ve výše uvedeném příkladu si všimněte, že __init__()
metoda byla definována v obou třídách, Triangle i Polygon. Když k tomu dojde, metoda v odvozené třídě přepíše metodu v základní třídě. To znamená, že __init__()
v Trojúhelníku dostane přednost před __init__
v Polygonu.
Obecně při přepsání základní metody máme tendenci definici spíše rozšířit, než ji jednoduše nahradit. Totéž se provádí voláním metody v základní třídě v jednom z jejich odvozené třídy (volání Polygon.__init__()
z __init__()
v Triangle
).
Lepší možností by bylo použití vestavěné funkce super()
. Je tedy super().__init__(3)
ekvivalentní Polygon.__init__(self,3)
a je upřednostňován. Další informace o super()
funkci v Pythonu najdete ve funkci Python super ().
Dvě integrované funkce isinstance()
a issubclass()
slouží ke kontrole dědičnosti.
Funkce isinstance()
vrátí, True
pokud je objekt instancí třídy nebo jiných tříd z ní odvozených. Každá třída v Pythonu dědí ze základní třídy object
.
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True
Podobně issubclass()
se používá ke kontrole dědičnosti třídy.
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True