Moștenirea ne permite să definim o clasă care preia toate funcționalitățile dintr-o clasă părinte și ne permite să adăugăm mai multe. În acest tutorial, veți învăța să utilizați moștenirea în Python.
Video: Moștenirea Python
Moștenirea în Python
Moștenirea este o caracteristică puternică în programarea orientată pe obiecte.
Se referă la definirea unei clase noi, cu puține sau deloc modificări unei clase existente. Noua clasă se numește clasă derivată (sau copil) și cea de la care moștenește se numește clasă de bază (sau părinte) .
Sintaxa moștenirii Python
clasa BaseClass: Corpul clasei de bază clasa DerivedClass (BaseClass): Corpul clasei derivate
Clasa derivată moștenește caracteristici din clasa de bază, unde pot fi adăugate noi caracteristici. Acest lucru are ca rezultat reutilizarea codului.
Exemplu de moștenire în Python
Pentru a demonstra utilizarea moștenirii, să luăm un exemplu.
Un poligon este o figură închisă cu 3 sau mai multe laturi. Spuneți, avem o clasă numită Polygon
definită după cum urmează.
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))
Această clasă are atribute de date pentru a stoca numărul de laturi n și magnitudinea fiecărei laturi ca o listă numită laturi.
inputSides()
Metoda ia în magnitudinea fiecărei părți și dispSides()
afișează aceste lungimi laterale.
Un triunghi este un poligon cu 3 laturi. Deci, putem crea o clasă numită Triunghi care moștenește din Poligon. Acest lucru face ca toate atributele clasei Polygon să fie disponibile clasei Triunghi.
Nu este nevoie să le definim din nou (reutilizarea codului). Triunghiul poate fi definit astfel.
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)
Cu toate acestea, clasa Triangle
are o nouă metodă findArea()
pentru a găsi și tipări zona triunghiului. Iată un exemplu de rulare.
>>> 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
Putem vedea că, deși nu am definit metode cum ar fi inputSides()
sau dispSides()
pentru clasă Triangle
separat, am putut să le folosim.
Dacă un atribut nu este găsit în clasa însăși, căutarea continuă până la clasa de bază. Aceasta se repetă recursiv, dacă clasa de bază este ea însăși derivată din alte clase.
Metodă suprascriere în Python
În exemplul de mai sus, observați că __init__()
metoda a fost definită în ambele clase, triunghi, precum și poligon. Când se întâmplă acest lucru, metoda din clasa derivată o suprascrie pe cea din clasa de bază. Acest lucru este de spus, __init__()
în Triunghi primește preferință față de __init__
în Poligon.
În general, atunci când suprascrieți o metodă de bază, avem tendința să extindem definiția, mai degrabă decât să o înlocuim pur și simplu. Același lucru se face apelând metoda în clasa de bază din cea din clasa derivată (apelând Polygon.__init__()
din __init__()
in Triangle
).
O opțiune mai bună ar fi utilizarea funcției încorporate super()
. Deci, super().__init__(3)
este echivalent Polygon.__init__(self,3)
și este preferat. Pentru a afla mai multe despre super()
funcția din Python, vizitați funcția Python super ().
Două funcții încorporate isinstance()
și issubclass()
sunt utilizate pentru a verifica moștenirile.
Funcția isinstance()
revine True
dacă obiectul este o instanță a clasei sau a altor clase derivate din aceasta. Fiecare clasă din Python moștenește din clasa de bază object
.
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True
În mod similar, issubclass()
este utilizat pentru a verifica moștenirea clasei.
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True