logo

Python super()

V Pythonu se funkce super() používá k odkazování na nadřazenou třídu nebo nadtřídu. Umožňuje volat metody definované v nadtřídě z podtřídy, což vám umožňuje rozšířit a přizpůsobit funkcionalitu zděděnou z nadřazené třídy.

Syntaxe super() v Pythonu

Syntax: super()



Vrátit se : Vraťte objekt proxy, který představuje třídu rodiče.

funkce super() v příkladu Pythonu

V uvedeném příkladu The Emp třída má __horký__ metoda, která inicializuje id , a název a Přidá atributy. The Na volné noze třída dědí z Emp třídy a přidá další atribut nazvaný e-maily. Volá metodu super() nadřazené třídy __init__, aby inicializovala zděděný atribut.

Python3



nekonečná smyčka






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)>

>

>

Výstup :

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

K čemu se používá metoda super ()?

Metodu z nadřazené třídy lze v Pythonu volat pomocí funkce super(). Je to typická praxe v objektově orientované programování volat metody nadtřídy a umožnit přepisování a dědění metod. I když aktuální třída nahradila tyto metody svou vlastní implementací, volání super() vám umožní přistupovat k metodám nadřazené třídy a používat je. Tímto způsobem můžete vylepšit a upravit chování nadřazené třídy a zároveň z toho získat.

Výhody super funkce

  • Pro přístup k jejím metodám si nemusíte pamatovat nebo specifikovat název nadřazené třídy. Tuto funkci lze použít v jednoduché i vícenásobné dědičnosti.
  • To implementuje modularitu (izolování změn) a opětovnou použitelnost kódu, protože není potřeba přepisovat celou funkci.
  • Super funkce v Pythonu se nazývá dynamicky, protože Python je dynamický jazyk, na rozdíl od jiných jazyků.

Jak funguje dědičnost bez Pythonu super?

V uvedeném příkladu je problém s metodou __init__ třídy Emp. Třída Emp je zděděna z třídy Person, ale ve své metodě __init__ nevolá metodu __init__ nadřazené třídy k inicializaci atributů name a 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>

>

>

Výstup :

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 24 25 # calling parent class function --->26 Emp_details.name_, Emp_details.name AttributeError: 'Emp' objekt nemá žádný atribut 'name'>

Oprava výše uvedeného problému pomocí Super v Pythonu

V poskytnutém kódu třída Emp správně dědí z třídy Person a metoda __init__ třídy Emp nyní správně volá metodu __init__ nadřazené třídy pomocí 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)>

java long to string
>

>

Výstup :

Mayank Mayank>

Porozumění Pythonu super() s metodami __init__()

Python má vyhrazenou metodu nazvanou __init__. V objektově orientovaném programování je označován jako konstruktor. Když je tato metoda volána, umožňuje třídě inicializovat atributy třídy. Ve zděděné podtřídě lze odkazovat na rodičovskou třídu pomocí funkce super(). Funkce super vrací dočasný objekt nadtřídy, který umožňuje přístup ke všem jejím metodám její podřízené třídě.

Poznámka: Další informace viz Dědičnost v Pythonu .

Super funkce s jednoduchou dědičností

Vezměme si příklad zvířat. Psi, kočky a krávy jsou součástí zvířat. Sdílejí také společné vlastnosti, jako např.

  • Jsou to savci.
  • Mají ocas a čtyři nohy.
  • Jsou to domácí zvířata.

Takže třídy psi, kočky a koně jsou podtřídou třídy zvířat. Toto je příklad jediné dědičnosti, protože mnoho podtříd je zděděno z jedné nadřazené třídy.

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()>

výběr řazení
>

>

Výstup :

It is a mammal. Has legs and tail>

Super s vícenásobnou dědičností

Vezměme si další příklad super funkce , Předpokládejme třídu může létat a umí plavat dědí ze třídy savců a tyto třídy jsou zděděny třídou zvířat. Třída zvířat tedy dědí z více základních tříd. Podívejme se na použití Krajta super s argumenty v tomto případě.

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'>)>

java polymorfismus
>

>

Výstup :

Třída Animal dědí po třídách se dvěma rodiči – canFly a canSwim. Instance podtřídy Carol tedy může přistupovat k oběma konstruktorům nadřazené třídy.

Dog cannot fly Dog cannot swim Dog Is a mammal>

Super s víceúrovňovou dědičností

Vezměme si další příklad super funkce , předpokládejme, že třídu, která umí plavat, zdědí canFly, canFly ze třídy savců. Třída savců tedy dědí z víceúrovňové dědičnosti. Podívejme se na použití Krajta super s argumenty v tomto případě.

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'>)>

>

>

ascii v jazyce Java

Výstup :

Dog cannot swim Dog cannot fly Dog Is a mammal>

Vícenásobná dědičnost Pythonu a MRO

V daném příkladu třída C dědí z tříd A a B a přepíše metodu age(). V metodě age() třídy C však řádek super(C, self).age() vyvolá metodu age() z další třídy v MRO. V tomto případě vyvolá metodu age() z třídy A, protože se v MRO objeví před třídou 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())>

>

>

Výstup :

(, , , ) [, , , ]>