Dědičnost Pythonu (s příklady)

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 Polygondefinovanou 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 Trianglemá 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 Trianglesamostatně, 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í, Truepokud 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

Zajímavé články...