Pärand võimaldab meil määratleda klassi, mis võtab kogu funktsionaalsuse üle vanemklassi juurest, ja võimaldab meil lisada rohkem. Selles õpetuses õpitakse Pythonis pärandit kasutama.
Video: Pythoni pärand
Pärand Pythonis
Pärand on objektorienteeritud programmeerimise võimas funktsioon.
See viitab uue klassi määratlemisele, olemasolevat klassi vähe või üldse mitte muutes. Uut klassi nimetatakse tuletatud (või lapse) klassiks ja seda, mille ta pärib, nimetatakse põhiklassiks .
Pythoni pärilikkuse süntaks
klass BaseClass: põhiklassi klassi keha DerivedClass (BaseClass): tuletatud klassi keha
Tuletatud klass pärib põhiklassi tunnused, kuhu saab uusi funktsioone lisada. Selle tulemuseks on koodi korduvkasutus.
Pärimise näide Pythonis
Pärandi kasutamise demonstreerimiseks võtame näite.
Hulknurk on kinnine kuju, millel on vähemalt kolm külge. Oletame, et meil on klass, mida nimetatakse Polygon
järgmiselt.
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))
Sellel klassil on andmete atribuudid, et salvestada külgede arv n ja mõlema külje suurus loendina, mida nimetatakse külgedeks.
inputSides()
Meetod võtab suurusjärku kummalgi poolel ja dispSides()
kuvab need küljepikkustega.
Kolmnurk on 3 küljega hulknurk. Niisiis saame luua klassi Kolmnurk, mis pärineb hulknurgast. See teeb kõik kolmnurga klassi atribuudid klassile Triangle kättesaadavaks.
Me ei pea neid uuesti määratlema (koodi korduvkasutus). Kolmnurka saab defineerida järgmiselt.
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)
Klassil Triangle
on aga findArea()
kolmnurga ala leidmiseks ja printimiseks uus meetod . Siin on näidisjooks.
>>> 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
Näeme, et kuigi me ei määratlenud selliseid meetodeid nagu inputSides()
või dispSides()
klassi jaoks Triangle
eraldi, suutsime neid kasutada.
Kui klassis endas atribuuti ei leidu, jätkub otsing baasklassi. See kordub rekursiivselt, kui baasklass on tuletatud teistest klassidest.
Meetodi alistamine Pythonis
Ülalolevas näites pange tähele, et __init__()
meetod määratleti mõlemas klassis, nii Kolmnurgas kui ka Hulknurgas. Kui see juhtub, alistab tuletatud klassi meetod baasklassi meetodi. See tähendab, __init__()
et kolmnurgas saab eelistada __init__
polügooni.
Üldiselt kipume alusmeetodi ületamisel pigem määratlust laiendama kui lihtsalt asendama. Sama tehakse helistades meetodi baasklassist ühest tuletatud klass (helistades Polygon.__init__()
alates __init__()
in Triangle
).
Parem variant oleks sisseehitatud funktsiooni kasutamine super()
. Niisiis, super().__init__(3)
on samaväärne Polygon.__init__(self,3)
ja on eelistatud. super()
Pythoni funktsiooni kohta lisateabe saamiseks külastage funktsiooni Python super ().
Kaks sisseehitatud funktsiooni isinstance()
ja issubclass()
neid kasutatakse pärandite kontrollimiseks.
Funktsioon isinstance()
naaseb, True
kui objekt on klassi või muude sellest tuletatud klasside eksemplar. Iga Pythoni klass pärib baasklassi object
.
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True
Samamoodi issubclass()
kasutatakse klassi pärimise kontrollimiseks.
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True