logo

Python super()

Programmā Python funkcija super() tiek izmantota, lai atsauktos uz vecāku klasi vai virsklasi. Tas ļauj izsaukt virsklasē definētās metodes no apakšklases, ļaujot paplašināt un pielāgot no vecākklases mantoto funkcionalitāti.

Super() sintakse programmā Python

Sintakse: super()



Atgriešanās: Atgriezt starpniekservera objektu, kas pārstāv vecāku klasi.

funkcija super() Python piemērā

Dotajā piemērā The Emp klasē ir __karsts__ metode, kas inicializē id , un nosaukums un Pievieno atribūti. The Ārštata klase manto no Emp klase un pievieno papildu atribūtu, ko sauc E-pasti. Tas izsauc vecākklases __init__ metodi super(), lai inicializētu mantoto atribūtu.

Python3








class> Emp():> >def> __init__(>self>,>id>, name, Add):> >self>.>id> => id> >self>.name>=> name> >self>.Add>=> Add> # Class freelancer inherits EMP> class> Freelance(Emp):> >def> __init__(>self>,>id>, name, Add, Emails):> >super>().__init__(>id>, name, Add)> >self>.Emails>=> Emails> Emp_1>=> Freelance(>103>,>'Suraj kr gupta'>,>'Noida'> ,>'KKK@gmails'>)> print>(>'The ID is:'>, Emp_1.>id>)> print>(>'The Name is:'>, Emp_1.name)> print>(>'The Address is:'>, Emp_1.Add)> print>(>'The Emails is:'>, Emp_1.Emails)>

>

>

Izvade:

The ID is: 103 The Name is: Suraj kr gupta The Address is: Noida The Emails is: KKK@gmails>

Kam tiek izmantota super () metode?

Metodi no vecākklases var izsaukt Python, izmantojot funkciju super(). Tā ir tipiska prakse objektorientētā programmēšana lai izsauktu virsklases metodes un iespējotu metodes ignorēšanu un pārmantošanu. Pat ja pašreizējā klase ir aizstājusi šīs metodes ar savu ieviešanu, super() izsaukšana ļauj piekļūt un izmantot vecākklases metodes. To darot, jūs varat uzlabot un mainīt vecāku klases uzvedību, vienlaikus gūstot no tā labumu.

virkne salīdzinājumā ar

Superfunkcijas priekšrocības

  • Nav jāatceras vai jānorāda vecākklases nosaukums, lai piekļūtu tās metodēm. Šo funkciju var izmantot gan vienā, gan vairākos mantojumos.
  • Tas ievieš modularitāti (izmaiņu izolēšanu) un koda atkārtotu izmantošanu, jo nav nepieciešams pārrakstīt visu funkciju.
  • Python superfunkcija tiek saukta dinamiski, jo Python atšķirībā no citām valodām ir dinamiska valoda.

Kā mantojums darbojas bez Python super?

Dotajā piemērā ir problēma ar Emp klases __init__ metodi. Emp klase ir mantota no klases Person, taču tās __init__ metodē tā neizsauc vecākklases __init__ metodi, lai inicializētu nosaukuma un id atribūtus.

Python3




# code> class> Person:> ># Constructor> >def> __init__(>self>, name,>id>):> >self>.name>=> name> >self>.>id> => id> ># To check if this person is an employee> >def> Display(>self>):> >print>(>self>.name,>self>.>id>)> > class> Emp(Person):> > >def> __init__(>self>, name,>id>):> >self>.name_>=> name> >def> Print>(>self>):> >print>(>'Emp class called'>)> Emp_details>=> Emp(>'Mayank'>,>103>)> # calling parent class function> Emp_details.name_, Emp_details.name>

>

>

Izvade:

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 24 25 # calling parent class function --->26 Emp_details.name_, Emp_details.name AttributeError: 'Emp' objektam nav atribūta 'name'>

Iepriekš minētās problēmas novēršana ar Super programmā Python

Norādītajā kodā Emp klase pareizi manto no klases Person, un Emp klases __init__ metode tagad pareizi izsauc vecākklases __init__ metodi, izmantojot super() Python .

Python3




# code> # A Python program to demonstrate inheritance> class> Person:> ># Constructor> >def> __init__(>self>, name,>id>):> >self>.name>=> name> >self>.>id> => id> ># To check if this person is an employee> >def> Display(>self>):> >print>(>self>.name,>self>.>id>)> > class> Emp(Person):> > >def> __init__(>self>, name,>id>):> >self>.name_>=> name> >super>().__init__(name,>id>)> >def> Print>(>self>):> >print>(>'Emp class called'>)> Emp_details>=> Emp(>'Mayank'>,>103>)> # calling parent class function> print>(Emp_details.name_, Emp_details.name)>

>

>

Izvade:

Mayank Mayank>

Python super() izpratne ar __init__() metodēm

Python ir rezervēta metode ar nosaukumu __init__. Objektorientētajā programmēšanā to dēvē par konstruktoru. Kad šī metode tiek izsaukta, tā ļauj klasei inicializēt klases atribūtus. Mantotā apakšklasē uz vecāku klasi var atsaukties, izmantojot funkciju super(). Superfunkcija atgriež pagaidu superklases objektu, kas ļauj piekļūt visām tās metodēm tās atvasinātajai klasei.

Piezīme: Lai iegūtu papildinformāciju, skatiet Mantojums Python valodā .

Super funkcija ar vienu mantojumu

Ņemsim piemēru no dzīvniekiem. Suņi, kaķi un govis ir daļa no dzīvniekiem. Viņiem ir arī kopīgas iezīmes, piemēram,

  • Tie ir zīdītāji.
  • Viņiem ir aste un četras kājas.
  • Tie ir mājdzīvnieki.

Tātad suņu, kaķu un zirgu klases ir dzīvnieku klases apakšklase. Šis ir vienas mantojuma piemērs, jo daudzas apakšklases tiek mantotas no viena vecāka klases.

Python3




# Python program to demonstrate> # super function> class> Animals:> ># Initializing constructor> >def> __init__(>self>):> >self>.legs>=> 4> >self>.domestic>=> True> >self>.tail>=> True> >self>.mammals>=> True> >def> isMammal(>self>):> >if> self>.mammals:> >print>(>'It is a mammal.'>)> >def> isDomestic(>self>):> >if> self>.domestic:> >print>(>'It is a domestic animal.'>)> class> Dogs(Animals):> >def> __init__(>self>):> >super>().__init__()> >def> isMammal(>self>):> >super>().isMammal()> class> Horses(Animals):> >def> __init__(>self>):> >super>().__init__()> >def> hasTailandLegs(>self>):> >if> self>.tail>and> self>.legs>=>=> 4>:> >print>(>'Has legs and tail'>)> # Driver code> Tom>=> Dogs()> Tom.isMammal()> Bruno>=> Horses()> Bruno.hasTailandLegs()>

>

>

Izvade:

It is a mammal. Has legs and tail>

Super ar vairākiem mantojumiem

Ņemsim citu superfunkcijas piemērs , Pieņemsim, ka klase var lidot un prot peldēt manto no zīdītāju klases, un šīs klases manto dzīvnieku klase. Tātad dzīvnieku klase manto no vairākām bāzes klasēm. Apskatīsim izmantošanu Python super ar argumentiem šajā gadījumā.

Python3




class> Mammal():> >def> __init__(>self>, name):> >print>(name,>'Is a mammal'>)> class> canFly(Mammal):> >def> __init__(>self>, canFly_name):> >print>(canFly_name,>'cannot fly'>)> ># Calling Parent class> ># Constructor> >super>().__init__(canFly_name)> class> canSwim(Mammal):> >def> __init__(>self>, canSwim_name):> >print>(canSwim_name,>'cannot swim'>)> >super>().__init__(canSwim_name)> class> Animal(canFly, canSwim):> >def> __init__(>self>, name):> >super>().__init__(name)> # Driver Code> Carol>=> Animal(>'Dog'>)>

>

>

Izvade:

Klase Dzīvnieks ir pārmantotas no divu vecāku klasēm – canFly un canSwim. Tātad apakšklases instance Carol var piekļūt abiem vecākklases konstruktoriem.

Dog cannot fly Dog cannot swim Dog Is a mammal>

Super ar daudzlīmeņu mantojumu

Ņemsim citu superfunkcijas piemērs , pieņemsim, ka klase prot peldēt, ir mantojusi canFly, canFly no zīdītāju klases. Tātad zīdītāju klase manto no daudzlīmeņu mantojuma. Apskatīsim izmantošanu Python super ar argumentiem šajā gadījumā.

Python3




class> Mammal():> >def> __init__(>self>, name):> >print>(name,>'Is a mammal'>)> class> canFly(Mammal):> >def> __init__(>self>, canFly_name):> >print>(canFly_name,>'cannot fly'>)> ># Calling Parent class> ># Constructor> >super>().__init__(canFly_name)> class> canSwim(canFly):> >def> __init__(>self>, canSwim_name):> >print>(canSwim_name,>'cannot swim'>)> >super>().__init__(canSwim_name)> class> Animal(canSwim):> >def> __init__(>self>, name):> ># Calling the constructor> ># of both the parent> ># class in the order of> ># their inheritance> >super>().__init__(name)> # Driver Code> Carol>=> Animal(>'Dog'>)>

>

>

Izvade:

Dog cannot swim Dog cannot fly Dog Is a mammal>

Python vairākkārtēja mantošana un MRO

Dotajā piemērā C klase tiek mantota no A un B klasēm, un tā ignorē vecumu() ​​metodi. Tomēr C klases metodē age() rinda super(C, self).age() izsauc vecumu() ​​metodi no nākamās klases MRO. Šajā gadījumā tas izsauks metodi age() no A klases, jo tā parādās pirms B klases MRO.

Python3




class> A:> >def> age(>self>):> >print>(>'Age is 21'>)> class> B:> >def> age(>self>):> >print>(>'Age is 23'>)> class> C(A, B):> >def> age(>self>):> >super>(C,>self>).age()> > c>=> C()> print>(C.__mro__)> print>(C.mro())>

>

>

Izvade:

(, , , ) [, , , ]>