Dedovanje Pythona (z primeri)

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 Polygondefiniran 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 Trianglenovo 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

Zanimive Članki...