Mantojums ir noderīgs, taču jūs varat pilnībā izmantot tās potenciālu, atkārtoti izmantojot kodu no bāzes klasēm.
Key Takeaways
- Python funkcija super() ļauj izsaukt virsklases metodes no apakšklases, atvieglojot mantojuma un metodes ignorēšanas ieviešanu.
- Funkcija super() ir cieši saistīta ar Python metodi Method Resolution Order (MRO), kas nosaka secību, kādā senču klasēs tiek meklētas metodes vai atribūti.
- Super() izmantošana klases konstruktoros ir izplatīta prakse, lai inicializētu kopīgos atribūtus vecākklasē un specifiskākus atribūtus pakārtotajā klasē. Neizmantojot super(), var rasties neparedzētas sekas, piemēram, trūkst atribūtu inicializācijas.
Viena no Python galvenajām iezīmēm ir tā OOP paradigma, ko varat izmantot, lai modelētu reālās pasaules entītijas un to attiecības.
Strādājot ar Python klasēm, jūs bieži izmantosit mantošanu un ignorēsit superklases atribūtus vai metodes. Python nodrošina a super() funkcija, kas ļauj izsaukt virsklases metodes no apakšklases.
Kas ir super() un kāpēc tas jums vajadzīgs?
Izmantojot mantošanu, varat izveidot jaunu Python klasi, kas pārmanto esošas klases līdzekļus. Varat arī ignorēt apakšklases virsklases metodes, nodrošinot alternatīvas implementācijas. Tomēr, iespējams, vēlēsities izmantot jauno funkcionalitāti papildus vecajai, nevis tās vietā. Šajā gadījumā, super() ir noderīga.
Jūs varat izmantot super() funkcija, lai piekļūtu virsklases atribūtiem un izsauktu virsklases metodes. Super ir būtiska, lai objektorientētā programmēšana jo tas atvieglo mantojuma un metodes ignorēšanas ieviešanu.
Kā darbojas super()?
Iekšēji, super() ir cieši saistīts ar Metodes izšķiršanas secība (MRO) Python, ko nosaka C3 linearizācijas algoritms.
Lūk, kā super() darbi:
- Nosakiet pašreizējo klasi un gadījumu: Kad tu zvani super() apakšklases metodē Python automātiski izdomā pašreizējo klasi (klasi, kurā ir izsauktā metode super()) un šīs klases gadījumu (t.i., sevi).
- Nosakiet superklasi: super() tiek izmantoti divi argumenti — pašreizējā klase un instance —, kas jums nav skaidri jānodod. Tā izmanto šo informāciju, lai noteiktu superklasi metodes izsaukuma deleģēšanai. Tas tiek darīts, pārbaudot klases hierarhiju un MRO.
- Izsauciet metodi superklasē: Kad ir noteikta superklase, super() ļauj izsaukt tās metodes tā, it kā jūs tās izsauktu tieši no apakšklases. Tas ļauj paplašināt vai ignorēt metodes, vienlaikus izmantojot sākotnējo implementāciju no superklases.
Super() izmantošana klases konstruktorā
Izmantojot super() klases konstruktors ir ierasta prakse, jo jūs bieži vēlaties inicializēt kopīgos atribūtus vecāku klasē un specifiskākus atribūtus bērnā.
Lai to demonstrētu, definējiet Python klasi, Tēvs, kas a Dēls klase manto no:
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())
Iekšpusē Dēls konstruktors, aicinājums uz super().init() izsauc Tēvs klases konstruktors, nokārtojot to vārds un uzvārds kā parametri. Tas nodrošina, ka Tēvs klase joprojām var pareizi iestatīt nosaukuma atribūtus, pat uz a Dēls objektu.
Ja nezvani super() klases konstruktorā tās vecākklases konstruktors nedarbosies. Tas var novest pie neparedzētām sekām, piemēram, trūkstošas atribūtu inicializācijas vai nepilnīgas vecākklases stāvokļa iestatīšanas:
...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...
Ja tagad mēģināt piezvanīt uz iegūt informāciju metodi, tas paaugstinās an Atribūta kļūda tāpēc ka self.first_name un pats.uzvārds atribūti nav inicializēti.
Super() izmantošana klases metodēs
Tu vari izmantot super() citās metodēs, izņemot konstruktorus, tieši tādā pašā veidā. Tas ļauj paplašināt vai ignorēt superklases metodes darbību.
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 Dēls klase manto no Tēvs un tam ir savs runāt metodi. The runāt metode Dēls klases lietojumi super().runā() zvanīt uz runāt metode Tēvs klasē. Tas ļauj tajā iekļaut ziņojumu no vecākklases, vienlaikus paplašinot to ar ziņojumu, kas raksturīgs bērnu klasei.
Neizdodas lietot super() metodē, kas ignorē citu, nozīmē, ka vecākklases metodē esošā funkcionalitāte nestāsies spēkā. Tā rezultātā metodes darbība tiek pilnībā aizstāta, kas var izraisīt uzvedību, kuru jūs neplānojāt.
Izpratne par metodes izšķiršanas secību
Metodes izšķiršanas secība (MRO) ir secība, kādā Python meklē priekšteču klases, kad piekļūstat metodei vai atribūtam. MRO palīdz Python noteikt, kuru metodi izsaukt, ja pastāv vairākas mantojuma hierarhijas.
classNigeria():
defculture(self):
print("Nigeria's culture")
classAfrica():
defculture(self):
print("Africa's culture")
Lūk, kas notiek, kad izveidojat instanci Lagosa klasē un zvaniet uz kultūra metode:
- Python sāk, meklējot kultūra metode sadaļā Lagosa pati klase. Ja tā to atrod, tā izsauc metodi. Ja nē, tas pāriet uz otro soli.
- Ja tas neatrod kultūra metode sadaļā Lagosa klasē Python aplūko bāzes klases tādā secībā, kādā tās parādās klases definīcijā. Šajā gadījumā, Lagosa manto vispirms no Āfrika un tad no Nigērija. Tātad Python meklēs kultūra metode iekšā Āfrika vispirms.
- Ja tas neatrod kultūra metode sadaļā Āfrika klasē, Python pēc tam meklēs Nigērija klasē. Šī darbība turpinās, līdz sasniedz hierarhijas beigas, un rada kļūdu, ja nevar atrast metodi nevienā no virsklasēm.
Izvade parāda metodes izšķirtspējas secību Lagosa, sākot no kreisās puses uz labo.
Bieži sastopamās nepilnības un labākā prakse
Strādājot ar super(), ir dažas izplatītas kļūmes, no kurām jāizvairās.
- Ņemiet vērā metodes izšķiršanas secību, jo īpaši vairāku mantojuma scenāriju gadījumā. Ja jums ir nepieciešams izmantot sarežģītu vairāku mantojumu, jums vajadzētu iepazīties ar C3 Linearizācijas algoritms ko Python izmanto, lai noteiktu MRO.
- Izvairieties no cirkulārās atkarības klases hierarhijā, kas var izraisīt neparedzamu uzvedību.
- Skaidri dokumentējiet savu kodu, īpaši lietojot super() sarežģītās klašu hierarhijās, lai padarītu to saprotamāku citiem izstrādātājiem.
Izmantojiet super() pareizo ceļu
Python's super() funkcija ir spēcīgs līdzeklis, kad strādājat ar mantojuma un metodes ignorēšanu. Saprotot, kā super() darbojas un paraugprakses ievērošana ļaus jums izveidot apkopējamāku un efektīvāku kodu savos Python projektos.