V Pythonu se funkcija super() uporablja za sklicevanje na nadrejeni razred ali nadrazred. Omogoča vam klicanje metod, definiranih v nadrazredu, iz podrazreda, kar vam omogoča, da razširite in prilagodite funkcionalnost, podedovano iz nadrejenega razreda.
Sintaksa super() v Pythonu
Sintaksa: super()
Povratek: Vrne proxy objekt, ki predstavlja nadrejeni razred.
funkcija super() v primeru Pythona
V danem primeru The Emp razred ima __vroče__ metoda, ki inicializira id , in ime in Dodaja lastnosti. The Samostojni razred podeduje od Emp razred in doda dodaten atribut imenovan E-poštna sporočila. Pokliče metodo __init__ nadrejenega razreda super(), da inicializira podedovani atribut.
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)> |
java niz v celo število
>
>
Izhod:
The ID is: 103 The Name is: Suraj kr gupta The Address is: Noida The Emails is: KKK@gmails>
Za kaj se uporablja metoda super ()?
Metodo iz nadrejenega razreda je mogoče poklicati v Pythonu s funkcijo super(). To je tipična praksa v objektno orientirano programiranje za klicanje metod nadrazreda in omogočanje preglasitve in dedovanja metod. Tudi če je trenutni razred nadomestil te metode z lastno izvedbo, vam klic super() omogoča dostop do metod nadrejenega razreda in njihovo uporabo. S tem lahko izboljšate in spremenite vedenje nadrejenega razreda, hkrati pa še vedno pridobite od tega.
Prednosti Super Function
- Za dostop do njegovih metod si ni treba zapomniti ali določiti imena nadrejenega razreda. To funkcijo je mogoče uporabiti pri enojnem in večkratnem dedovanju.
- To izvaja modularnost (izoliranje sprememb) in možnost ponovne uporabe kode, saj ni potrebe po prepisu celotne funkcije.
- Super funkcija v Pythonu se kliče dinamično, ker je Python dinamičen jezik, za razliko od drugih jezikov.
Kako deluje dedovanje brez Python super?
V danem primeru je težava z metodo __init__ razreda Emp. Razred Emp je podedovan od razreda Person, vendar v svoji metodi __init__ ne kliče metode __init__ nadrejenega razreda za inicializacijo atributov imena in id.
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> |
>
>
Izhod:
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 24 25 # calling parent class function --->26 Emp_details.name_, Emp_details.name AttributeError: Objekt 'Emp' nima atributa 'name'>
Odpravljanje zgornje težave s Super v Pythonu
V predloženi kodi razred Emp pravilno deduje od razreda Person in metoda __init__ razreda Emp zdaj pravilno kliče metodo __init__ nadrejenega razreda z uporabo super() v Pythonu.
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)> |
>
>
Izhod:
Mayank Mayank>
Razumevanje Python super() z metodami __init__().
Python ima rezervirano metodo, imenovano __init__. V objektno usmerjenem programiranju se imenuje konstruktor. Ko se ta metoda pokliče, omogoči razredu, da inicializira atribute razreda. V podedovanem podrazredu se lahko na nadrejeni razred sklicujete z uporabo funkcije super(). Super funkcija vrne začasni objekt nadrazreda, ki omogoča dostop do vseh njegovih metod njegovemu podrejenemu razredu.
Opomba: Za več informacij glejte Dedovanje v Pythonu .
Super funkcija z enojnim dedovanjem
Vzemimo primer živali. Psi, mačke in krave so del živali. Imajo tudi skupne značilnosti, kot so –
- So sesalci.
- Imajo rep in štiri noge.
- So domače živali.
Torej so razredi psi, mačke in konji podrazred razreda živali. To je primer enojnega dedovanja, ker je veliko podrazredov podedovanih od enostarševskega razreda.
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()> |
>
>
Izhod:
It is a mammal. Has legs and tail>
Super z več dedovanjem
Vzemimo drugo primer super funkcije , Recimo razred lahko leti in zna plavati podedujejo od razreda sesalcev in te razrede podeduje razred živali. Torej razred živali deduje več osnovnih razredov. Poglejmo si uporabo Python super z argumenti v tem primeru.
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'>)> |
>
>
Izhod:
Razred Animal deduje od dveh starševskih razredov – canFly in canSwim. Torej lahko primerek podrazreda Carol dostopa do obeh konstruktorjev nadrejenega razreda.
Dog cannot fly Dog cannot swim Dog Is a mammal>
Super z večnivojskim dedovanjem
Vzemimo drugo primer super funkcije , predpostavimo, da razred zna plavati podeduje canFly, canFly iz razreda sesalcev. Torej razred sesalcev deduje iz večnivojskega dedovanja. Poglejmo si uporabo Python super z argumenti v tem primeru.
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'>)> |
>
>
Izhod:
Dog cannot swim Dog cannot fly Dog Is a mammal>
Python večkratno dedovanje in MRO
V danem primeru razred C podeduje razrede A in B ter preglasi metodo age(). Vendar pa v metodi age() razreda C vrstica super(C, self).age() prikliče metodo age() iz naslednjega razreda v MRO. V tem primeru bo priklical metodo age() iz razreda A, ker se v MRO pojavi pred razredom B.
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())> |
>
>
Izhod:
(, , , ) [, , , ]>