Periytys on hyödyllistä, mutta voit vapauttaa sen täyden potentiaalin käyttämällä perusluokkien koodia uudelleen.

Key Takeaways

  • Pythonin super()-funktion avulla voit kutsua superluokan menetelmiä alaluokasta, mikä helpottaa periytymisen ja menetelmän ohituksen toteuttamista.
  • Super()-funktio liittyy läheisesti Pythonin Method Resolution Orderiin (MRO), joka määrittää järjestyksen, jossa esi-isoluokista menetelmiä tai attribuutteja etsitään.
  • Super()-funktion käyttäminen luokan konstruktoreissa on yleinen käytäntö yleisten attribuuttien alustamiseen pääluokassa ja tarkemmat attribuutit aliluokassa. Super():n käytön epäonnistuminen voi johtaa ei-toivottuihin seurauksiin, kuten puuttuviin määritteiden alustuksiin.

Yksi Pythonin ydinominaisuuksista on sen OOP-paradigma, jonka avulla voit mallintaa reaalimaailman kokonaisuuksia ja niiden suhteita.

Kun työskentelet Python-luokkien kanssa, käytät usein periytymistä ja ohitat superluokan attribuutit tai menetelmät. Python tarjoaa a super() funktio, jonka avulla voit kutsua superluokan menetelmiä alaluokasta.

instagram viewer

Mikä on super() ja miksi tarvitset sitä?

Perinnön avulla voit luoda uuden Python-luokan, joka perii olemassa olevan luokan ominaisuudet. Voit myös ohittaa aliluokan superluokan menetelmiä tarjoamalla vaihtoehtoisia toteutuksia. Voit kuitenkin haluta käyttää uusia toimintoja vanhan lisäksi sen sijaan. Tässä tapauksessa, super() on hyödyllinen.

Voit käyttää super() toiminto käyttää superluokan attribuutteja ja kutsua superluokan menetelmiä. Super on välttämätöntä olio-ohjelmointi koska se helpottaa periytymisen ja menetelmän ohituksen toteuttamista.

Miten super() toimii?

Sisäisesti, super() liittyy läheisesti Menetelmän ratkaisujärjestys (MRO) Pythonissa, jonka C3-linearisointialgoritmi määrittää.

Toimi näin super() toimii:

  1. Määritä nykyinen luokka ja ilmentymä: Kun soitat super() aliluokan menetelmän sisällä Python selvittää automaattisesti nykyisen luokan (luokka, joka sisältää kutsuneen menetelmän super()) ja kyseisen luokan esiintymä (ts. itse).
  2. Määritä superluokka: super() ottaa kaksi argumenttia - nykyisen luokan ja ilmentymän - joita sinun ei tarvitse antaa erikseen. Se käyttää näitä tietoja määrittääkseen superluokan menetelmäkutsun delegoimiseksi. Se tekee tämän tutkimalla luokkahierarkiaa ja MRO: ta.
  3. Kutsu menetelmä superluokassa: Kun superluokka on määritetty, super() voit kutsua sen menetelmiä ikään kuin kutsuisit niitä suoraan alaluokasta. Tämän avulla voit laajentaa tai ohittaa menetelmiä samalla kun käytät alkuperäistä superluokan toteutusta.

Super():n käyttäminen luokkakonstruktorissa

Käyttämällä super() luokassa konstruktorissa on yleinen käytäntö, koska usein haluat alustaa yleiset attribuutit pääluokassa ja tarkemmat attribuutit lapsessa.

Tämän osoittamiseksi, määrittele Python-luokka, Isä, joka a Poika luokka perii:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(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 = hobby

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

Sisällä Poika rakentaja, kutsu super().init() kutsuu Isä luokan rakentaja, läpäisee sen etunimi ja sukunimi parametreina. Tämä varmistaa, että Isä luokka voi silti asettaa nimiattribuutit oikein, jopa a Poika esine.

Jos et soita super() luokan konstruktorissa sen emoluokan rakentaja ei toimi. Tämä voi johtaa ei-toivottuihin seurauksiin, kuten puuttuviin attribuuttien alustuksiin tai emoluokan tilan epätäydellisiin asetuksiin:

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

Jos yrität nyt soittaa saada tietoa menetelmällä, se nostaa an AttributeError koska itse.etunimi ja itse.sukunimi attribuutteja ei ole alustettu.

Super():n käyttö Class Methodsissa

Voit käyttää super() muilla menetelmillä, paitsi rakentajilla, samalla tavalla. Tämän avulla voit laajentaa tai ohittaa superluokan menetelmän käyttäytymistä.

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 Poika luokka perii Isä ja sillä on sen puhua menetelmä. The puhua menetelmä Poika luokan käyttöjä super().puhu() soittaa puhua menetelmä Isä luokkaa. Tämä mahdollistaa sen, että se voi sisällyttää viestin pääluokasta ja laajentaa sitä aliluokkakohtaisella viestillä.

Käyttämättä jättäminen super() menetelmässä, joka ohittaa toisen, tarkoittaa, että emoluokan menetelmässä oleva toiminto ei tule voimaan. Tämä johtaa menetelmän toiminnan täydelliseen korvaamiseen, mikä voi johtaa käyttäytymiseen, jota et aikonut.

Menetelmän ratkaisujärjestyksen ymmärtäminen

Method Resolution Order (MRO) on järjestys, jossa Python etsii esi-isäluokkia, kun käytät menetelmää tai attribuuttia. MRO auttaa Pythonia määrittämään, mitä menetelmää kutsua, kun useita perintöhierarkioita on olemassa.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

Näin tapahtuu, kun luot esiintymän Lagos luokkaa ja soita kulttuuri menetelmä:

  1. Python aloittaa etsimällä kulttuuri menetelmässä Lagos luokka itse. Jos se löytää sen, se kutsuu menetelmää. Jos ei, se siirtyy vaiheeseen kaksi.
  2. Jos se ei löydä kulttuuri menetelmässä Lagos luokka, Python tarkastelee perusluokat siinä järjestyksessä kuin ne näkyvät luokan määritelmässä. Tässä tapauksessa, Lagos perii ensin Afrikka ja sitten alkaen Nigeria. Joten Python etsii kulttuuri menetelmä sisään Afrikka ensimmäinen.
  3. Jos se ei löydä kulttuuri menetelmässä Afrikka luokkaa, Python etsii sitten Nigeria luokkaa. Tämä toiminta jatkuu, kunnes se saavuttaa hierarkian lopun, ja antaa virheilmoituksen, jos se ei löydä menetelmää mistään superluokista.

Tulos näyttää Method Resolution Order of Lagos, alkaen vasemmalta oikealle.

Yleiset sudenkuopat ja parhaat käytännöt

Kun työskentelet super(), joitain yleisiä sudenkuoppia on vältettävä.

  1. Muista menetelmän ratkaisujärjestys, erityisesti useissa perinnöllisissä skenaarioissa. Jos sinun on käytettävä monimutkaista moniperintöä, sinun tulee tuntea C3 Linearisointialgoritmi jota Python käyttää MRO: n määrittämiseen.
  2. Vältä pyöreitä riippuvuuksia luokkahierarkiassasi, mikä voi johtaa arvaamattomaan käyttäytymiseen.
  3. Dokumentoi koodisi selkeästi, varsinkin käytettäessä super() monimutkaisissa luokkahierarkioissa, jotta se olisi ymmärrettävämpi muille kehittäjille.

Käytä super() oikealla tavalla

Pythonin super() -toiminto on tehokas ominaisuus, kun työskentelet periytymisen ja menetelmän ohituksen kanssa. Ymmärtäminen miten super() toimii ja parhaiden käytäntöjen noudattamisen avulla voit luoda ylläpidettävämpää ja tehokkaampaa koodia Python-projekteihisi.