Dedovanje nam omogoča, da določimo razred, ki prevzame vse funkcije nadrejenega razreda in nam omogoča, da dodamo več. V tej vadnici se boste naučili uporabljati dedovanje v Pythonu.
Video: Dedovanje Pythona
Dedovanje v Pythonu
Dedovanje je močna lastnost objektno usmerjenega programiranja.
Nanaša se na opredelitev novega razreda z malo ali nič sprememb obstoječega razreda. Novi razred se imenuje izpeljani (ali podrejeni) razred, tisti, iz katerega ga podeduje, pa osnovni (ali nadrejeni) razred .
Sintaksa dedovanja Pythona
class BaseClass: Telo razreda osnovnega razreda DerivedClass (BaseClass): Telo izpeljanega razreda
Izpeljani razred podeduje funkcije iz osnovnega razreda, kjer mu je mogoče dodati nove funkcije. Posledica tega je ponovna uporabnost kode.
Primer dedovanja v Pythonu
Za prikaz uporabe dediščine vzemimo primer.
Poligon je zaprta figura s 3 ali več stranicami. Recimo, imamo razred z imenom, ki je Polygon
definiran na naslednji način.
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))
Ta razred ima atribute podatkov za shranjevanje števila stranic n in velikosti vsake strani kot seznama, imenovanega stranice.
inputSides()
Metoda je v velikosti vsaki strani in dispSides()
prikazuje te stranske dolžine.
Trikotnik je mnogokotnik s tremi stranicami. Tako lahko ustvarimo razred Triangle, ki podeduje Polygon. Tako so vsi atributi razreda Poligon na voljo razredu Trikotnik.
Ni nam jih treba več definirati (ponovna uporaba kode). Trikotnik lahko definiramo na naslednji način.
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)
Vendar ima razred Triangle
novo metodo findArea()
za iskanje in tiskanje površine trikotnika. Tu je vzorčni zagon.
>>> 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
Vidimo lahko, da čeprav nismo ločeno opredelili metod, kot so inputSides()
ali dispSides()
za razred Triangle
, smo jih lahko uporabili.
Če v razredu samega ni mogoče najti atributa, se iskanje nadaljuje do osnovnega razreda. To se ponavlja rekurzivno, če je osnovni razred sam izpeljan iz drugih razredov.
Preglasitev metode v Pythonu
V zgornjem primeru upoštevajte, da __init__()
je bila metoda definirana v obeh razredih, Trikotnik in tudi Poligon. Ko se to zgodi, metoda v izvedenem razredu preglasi tisto v osnovnem razredu. To pomeni, da ima __init__()
Triangle prednost pred __init__
poligonom.
Na splošno pri razveljavitvi osnovne metode običajno razširimo definicijo in ne le zamenjamo. Enako se stori s klicanjem metode v osnovnem razredu iz metode v izpeljanem razredu (klicanje Polygon.__init__()
iz __init__()
v Triangle
).
Boljša možnost bi bila uporaba vgrajene funkcije super()
. Torej super().__init__(3)
je enakovredno Polygon.__init__(self,3)
in je prednostno. Če želite izvedeti več o super()
funkciji v Pythonu, obiščite funkcijo Python super ().
Dve vgrajeni funkciji isinstance()
in issubclass()
se uporabljata za preverjanje dedovanja.
Funkcija se isinstance()
vrne, True
če je objekt primerek razreda ali drugih razredov, ki iz njega izhajajo. Vsak razred v Pythonu podeduje iz osnovnega razreda object
.
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True
Podobno issubclass()
se uporablja za preverjanje dedovanja razreda.
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True