Python-perintö (esimerkkien avulla)

Perinnön avulla voimme määritellä luokan, joka vie kaikki toiminnot vanhemmalta luokalta ja antaa meille mahdollisuuden lisätä lisää. Tässä opetusohjelmassa opit käyttämään perintöä Pythonissa.

Video: Pythonin perintö

Perintö Pythonissa

Perintö on tehokas ominaisuus olio-ohjelmoinnissa.

Se viittaa uuden luokan määrittelyyn, jos olemassa olevaan luokkaan ei ole tehty mitään muutoksia. Uutta luokkaa kutsutaan johdetuksi (tai lapsi) luokaksi ja sitä luokkaa , jolta se perii, kutsutaan perus (tai vanhempi) luokaksi .

Python-perintösyntaksi

 luokka BaseClass: Perusluokan runko DerivedClass (BaseClass): Johdetun luokan runko

Johdettu luokka perii ominaisuudet perusluokasta, jossa siihen voidaan lisätä uusia ominaisuuksia. Tämä johtaa koodin uudelleenkäyttöön.

Esimerkki perinnöstä Pythonissa

Otetaan esimerkki perinnön käytön osoittamiseksi.

Monikulmio on suljettu kuva, jossa on vähintään 3 sivua. Sano, että meillä on nimeltään luokka, joka Polygonmääritellään seuraavasti.

 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))

Tällä luokalla on tietoattribuutteja, joilla sivujen lukumäärä n ja kummankin puolen suuruus voidaan tallentaa listaksi, jota kutsutaan sivuiksi.

inputSides()Menetelmä vie suuruutta kummallakin puolella ja dispSides()näyttää nämä sivujen pituudet.

Kolmio on monikulmio, jossa on 3 sivua. Joten voimme luoda luokan nimeltä Kolmio, joka perii monikulmiosta. Tämä asettaa kaikki Polygon-luokan määritteet saataville Triangle-luokalle.

Meidän ei tarvitse määritellä niitä uudelleen (koodin uudelleenkäytettävyys). Kolmio voidaan määritellä seuraavasti.

 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)

Luokalla Triangleon kuitenkin uusi tapa findArea()löytää ja tulostaa kolmion alue. Tässä on näyte ajo.

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

Voimme nähdä, että vaikka emme määrittäneet menetelmiä, kuten inputSides()tai dispSides()luokalle Triangleerikseen, pystyimme käyttämään niitä.

Jos määritettä ei löydy itse luokasta, haku jatkuu perusluokkaan. Tämä toistuu rekursiivisesti, jos perusluokka on itse johdettu muista luokista.

Menetelmän ohittaminen Pythonissa

Yllä olevassa esimerkissä huomaa, että __init__()menetelmä määritettiin molemmissa luokissa, sekä kolmiossa että monikulmiossa. Kun näin tapahtuu, johdetun luokan menetelmä ohittaa perusluokan menetelmän. Tämä tarkoittaa, __init__()että kolmio saa etusijan __init__monikulmioon.

Perusmenetelmää ohitettaessa yleensä pyrimme laajentamaan määritelmää sen sijaan, että yksinkertaisesti korvaamme sen. Sama tehdään soittamalla menetelmällä perustaa luokan päässä yksi johdettu luokka (jossa Polygon.__init__()kohteesta __init__()in Triangle).

Parempi vaihtoehto olisi käyttää sisäänrakennettua toimintoa super(). Joten super().__init__(3)vastaa Polygon.__init__(self,3)ja on edullinen. Lisätietoja super()Pythonin toiminnosta on Python super () -funktiossa.

Kaksi sisäänrakennettua toimintoja isinstance()ja issubclass()tarkistukseen käytetään perinnöt.

Funktio isinstance()palauttaa, Truejos objekti on luokan tai muiden siitä johdettujen luokkien esiintymä. Jokainen Pythonin luokka perii perusluokan object.

 >>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True

Vastaavasti issubclass()sitä käytetään luokan perinnön tarkistamiseen.

 >>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True

Mielenkiintoisia artikkeleita...