Paveldėjimas yra naudingas, tačiau galite išnaudoti visą jo potencialą pakartotinai naudodami kodą iš bazinių klasių.
Key Takeaways
- Python funkcija super() leidžia iškviesti superklasės metodus iš poklasio, todėl lengviau įgyvendinti paveldėjimą ir metodo nepaisymą.
- Funkcija super() yra glaudžiai susijusi su Python metodo rezoliucijos tvarka (MRO), kuri nustato tvarką, kuria protėvių klasėse ieškoma metodų ar atributų.
- Super() naudojimas klasės konstruktoriuose yra įprasta praktika inicijuoti bendruosius atributus pagrindinėje klasėje ir konkretesnius antrinėje klasėje. Nepanaudojus super(), gali atsirasti nenumatytų pasekmių, pvz., trūksta atributų inicijavimo.
Viena iš pagrindinių Python ypatybių yra jos OOP paradigma, kurią galite naudoti modeliuodami realaus pasaulio objektus ir jų santykius.
Dirbdami su Python klasėmis dažnai naudosite paveldėjimą ir nepaisysite superklasės atributų ar metodų. Python suteikia a super () funkcija, leidžianti iš poklasio iškviesti superklasės metodus.
Kas yra super() ir kam to reikia?
Naudodami paveldėjimą galite sukurti naują Python klasę, kuri paveldėtų esamos klasės ypatybes. Taip pat galite nepaisyti poklasio superklasės metodų, pateikdami alternatyvius įgyvendinimus. Tačiau galbūt norėsite naudoti naują funkciją kartu su senąja, o ne vietoje jos. Tokiu atveju, super () yra naudingas.
Galite naudoti super () funkcija pasiekti superklasės atributus ir iškviesti superklasės metodus. Super yra būtinas Objektinis programavimas nes taip lengviau įgyvendinti paveldimumo ir metodo nepaisymą.
Kaip veikia super()?
Viduje, super () yra glaudžiai susijęs su Metodo sprendimo tvarka (MRO) Python programoje, kurią nustato C3 linijavimo algoritmas.
Štai kaip super () veikia:
- Nustatykite esamą klasę ir egzempliorių: Kai skambinate super () poklasio metodo viduje Python automatiškai nustato dabartinę klasę (klasę, kurioje yra metodas, kuris iškvietė super ()) ir tos klasės egzempliorius (t. y. savarankiškai).
- Nustatykite superklasę: super () turi du argumentus – dabartinę klasę ir egzempliorių – kurių jums nereikia aiškiai perduoti. Ji naudoja šią informaciją, kad nustatytų superklasę, kuri perduotų metodo iškvietimą. Jis tai daro nagrinėdamas klasės hierarchiją ir MRO.
- Iškvieskite metodą superklasėje: Kai bus nustatyta superklasė, super () leidžia iškviesti jo metodus taip, lyg juos kviestumėte tiesiai iš poklasio. Tai leidžia išplėsti arba nepaisyti metodų, naudojant originalų superklasės įgyvendinimą.
Super() naudojimas klasės konstruktoriuje
Naudojant super () klasės konstruktoriuje yra įprasta praktika, nes dažnai norėsite inicijuoti bendrus pirminės klasės atributus ir konkretesnius vaiko atributus.
Norėdami tai įrodyti, apibrėžti Python klasę, tėvas, kuris a Sūnus klasė paveldi iš:
classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_nameclassSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)self.age = age
self.hobby = hobbydefget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")
# Access attributes
print(son.get_info())
Viduje Sūnus konstruktorius, kvietimas super().init() kreipiasi į tėvas klasės konstruktorius, jį išlaikęs Pirmas vardas ir pavardė kaip parametrai. Tai užtikrina, kad tėvas klasė vis tiek gali teisingai nustatyti vardo atributus, net ir a Sūnus objektas.
Jei neskambinsi super () klasės konstruktoriuje jo pirminės klasės konstruktorius neveiks. Tai gali sukelti nenumatytų pasekmių, pvz., trūkstamų atributų inicijavimo arba nebaigtos pagrindinės klasės būsenos sąrankos:
...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...
Jei dabar bandysite paskambinti gauti informaciją metodu, jis padidins an Atributo klaida nes savęs.vardas ir pats.pavardė atributai nebuvo inicijuoti.
Super() naudojimas klasės metoduose
Tu gali naudoti super () kitais metodais, išskyrus konstruktorius, lygiai taip pat. Tai leidžia išplėsti arba nepaisyti superklasės metodo veikimo.
classFather:
defspeak(self):
return"Hello from Father"classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"# Create an instance of the Son class
son = Son()# Call the speak method of the Son class
son_greeting = son.speak()
print(son_greeting)
The Sūnus klasė paveldi iš tėvas ir turi savo kalbėti metodas. The kalbėti metodas Sūnus klasės naudojimas super().speak() paskambinti kalbėti metodas tėvas klasė. Tai leidžia įtraukti pranešimą iš pagrindinės klasės ir išplėsti jį pranešimu, būdingu antrinei klasei.
Nepavyksta naudoti super () metodu, kuris nepaiso kito, reiškia, kad pagrindinės klasės metodo funkcionalumas neįsigalios. Dėl to metodo elgsena visiškai pakeičiama, o tai gali sukelti elgesį, kurio neketinote.
Metodo sprendimo tvarkos supratimas
Metodo sprendimo tvarka (MRO) yra tvarka, kuria „Python“ ieško protėvių klasių, kai pasiekiate metodą arba atributą. MRO padeda Python nustatyti, kurį metodą iškviesti, kai egzistuoja kelios paveldėjimo hierarchijos.
classNigeria():
defculture(self):
print("Nigeria's culture")
classAfrica():
defculture(self):
print("Africa's culture")
Štai kas nutinka, kai sukuriate egzempliorių Lagosas klasę ir paskambinkite kultūra metodas:
- Python pradeda ieškoti kultūra metodas Lagosas pati klasė. Jei randa, vadina metodą. Jei ne, pereinama prie antrojo žingsnio.
- Jei neranda kultūra metodas Lagosas klasėje, Python žiūri į bazines klases tokia tvarka, kokia jos yra klasės apibrėžime. Tokiu atveju, Lagosas pirmiausia paveldi iš Afrika ir tada iš Nigerija. Taigi, Python ieškos kultūra metodas in Afrika Pirmas.
- Jei neranda kultūra metodas Afrika klasėje, Python pažiūrės į Nigerija klasė. Šis elgesys tęsiasi tol, kol pasiekia hierarchijos pabaigą ir pateikia klaidą, jei neranda metodo nė vienoje iš superklasių.
Išvestis rodo metodo skyros tvarką Lagosas, pradedant iš kairės į dešinę.
Dažni spąstai ir geriausia praktika
Dirbant su super (), yra keletas bendrų spąstų, kurių reikia vengti.
- Atsižvelkite į metodo sprendimo tvarką, ypač kai yra keli paveldėjimo scenarijai. Jei jums reikia naudoti sudėtingą daugialypį paveldėjimą, turėtumėte būti susipažinę su C3 Linearizacijos algoritmas kurį Python naudoja MRO nustatyti.
- Venkite cirkuliarinių priklausomybių savo klasės hierarchijoje, nes tai gali sukelti nenuspėjamą elgesį.
- Aiškiai užregistruokite savo kodą, ypač naudojant super () sudėtingose klasių hierarchijose, kad ji būtų suprantamesnė kitiems kūrėjams.
Naudokite super() teisingą būdą
Python'as super () funkcija yra galinga funkcija, kai dirbate su paveldėjimo ir metodo nepaisymu. Supratimas kaip super () veikia ir vadovaudamiesi geriausios praktikos pavyzdžiais galėsite sukurti lengviau prižiūrimą ir efektyvesnį kodą savo Python projektuose.