Dedovanje je uporabno, vendar lahko odklenete njegov polni potencial s ponovno uporabo kode iz osnovnih razredov.

Ključni zaključki

  • Pythonova funkcija super() vam omogoča klicanje metod nadrazreda iz podrazreda, kar olajša implementacijo dedovanja in preglasitev metode.
  • Funkcija super() je tesno povezana z vrstnim redom razreševanja metod (MRO) v Pythonu, ki določa vrstni red, v katerem se v razredih prednikov iščejo metode ali atributi.
  • Uporaba super() v konstruktorjih razreda je običajna praksa za inicializacijo skupnih atributov v nadrejenem razredu in bolj specifičnih v podrejenem razredu. Če ne uporabite super(), lahko pride do nenamernih posledic, kot je manjkajoča inicializacija atributa.

Ena od ključnih značilnosti Pythona je njegova OOP paradigma, ki jo lahko uporabite za modeliranje entitet iz resničnega sveta in njihovih odnosov.

Ko delate z razredi Python, boste pogosto uporabili dedovanje in preglasili atribute ali metode nadrazreda. Python ponuja a super() funkcijo, ki vam omogoča klicanje metod nadrazreda iz podrazreda.

instagram viewer

Kaj je super() in zakaj ga potrebujete?

Z uporabo dedovanja lahko ustvarite nov razred Python, ki podeduje funkcije obstoječega razreda. Prav tako lahko preglasite metode nadrazreda v podrazredu in zagotovite alternativne izvedbe. Vendar pa boste morda želeli uporabiti novo funkcionalnost poleg stare in ne namesto nje. V tem primeru, super() je uporaben.

Lahko uporabite super() funkcija za dostop do atributov nadrazreda in priklic metod nadrazreda. Super je bistvenega pomena za objektno orientirano programiranje ker olajša implementacijo dedovanja in preglasitev metode.

Kako deluje super()?

interno, super() je tesno povezana z Naročilo za razrešitev metode (MRO) v Pythonu, ki ga določi C3 linearizacijski algoritem.

Evo kako super() dela:

  1. Določite trenutni razred in primerek: Ko pokličete super() znotraj metode podrazreda Python samodejno ugotovi trenutni razred (razred, ki vsebuje metodo, ki je poklicala super()) in primerek tega razreda (tj. sebe).
  2. Določite nadrazred: super() sprejme dva argumenta – trenutni razred in primerek – ki vam ju ni treba izrecno posredovati. Te informacije uporablja za določitev nadrazreda za delegiranje klica metode. To naredi tako, da preuči hierarhijo razredov in MRO.
  3. Prikličite metodo v nadrazredu: Ko je določen nadrazred, super() omogoča klicanje njegovih metod, kot da bi jih klicali neposredno iz podrazreda. To vam omogoča, da razširite ali preglasite metode, medtem ko še vedno uporabljate izvirno izvedbo iz nadrazreda.

Uporaba super() v konstruktorju razreda

Uporaba super() v konstruktorju razreda je običajna praksa, saj boste pogosto želeli inicializirati skupne atribute v nadrejenem razredu in bolj specifične v podrejenem razredu.

Da bi to dokazali, definirati razred Python, Oče, ki a sin razred podeduje od:

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

Znotraj sin konstruktor, poziv k super().init() prikliče Oče konstruktor razreda, ki ga posreduje ime in priimek kot parametri. To zagotavlja, da Oče lahko še vedno pravilno nastavi atribute imena, tudi na a sin predmet.

Če ne pokličete super() v konstruktorju razreda se konstruktor njegovega nadrejenega razreda ne bo izvajal. To lahko povzroči nenamerne posledice, kot so manjkajoče inicializacije atributov ali nepopolna nastavitev stanja nadrejenega razreda:

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

Če zdaj poskusite poklicati get_info metoda bo dvignila an AttributeError zaradi self.ime in sam.priimek atributi niso bili inicializirani.

Uporaba super() v metodah razreda

Lahko uporabiš super() v drugih metodah, razen pri konstruktorjih, na povsem enak način. To vam omogoča, da razširite ali preglasite vedenje metode nadrazreda.

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 sin razred podeduje od Oče in ima svoje govoriti metoda. The govoriti metoda sin razredne uporabe super().govori() poklicati govoriti metoda Oče razred. To mu omogoča, da vključi sporočilo iz nadrejenega razreda, medtem ko ga razširi s sporočilom, specifičnim za podrejeni razred.

Neuporaba super() v metodi, ki preglasi drugo, pomeni, da funkcionalnost, prisotna v metodi nadrejenega razreda, ne bo imela učinka. Posledica tega je popolna zamenjava vedenja metode, kar lahko povzroči vedenje, ki ga niste nameravali.

Razumevanje vrstnega reda razrešitve metode

Vrstni red razrešitve metode (MRO) je vrstni red, v katerem Python išče razrede prednikov, ko dostopate do metode ali atributa. MRO pomaga Pythonu določiti, katero metodo poklicati, ko obstaja več hierarhij dedovanja.

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

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

Evo, kaj se zgodi, ko ustvarite primerek Lagos razreda in pokličite kultura metoda:

  1. Python začne z iskanjem kultura metoda v Lagos sam razred. Če ga najde, pokliče metodo. Če ne, se premakne na drugi korak.
  2. Če ne najde kultura metoda v Lagos razreda, Python pogleda osnovne razrede v vrstnem redu, kot so prikazani v definiciji razreda. V tem primeru, Lagos podeduje najprej od Afrika in nato od Nigerija. Torej bo Python iskal kultura metoda v Afrika prvi.
  3. Če ne najde kultura metoda v Afrika razred, bo Python nato pogledal v Nigerija razred. To vedenje se nadaljuje, dokler ne doseže konca hierarhije in vrže napako, če ne najde metode v nobenem od nadrazredov.

Izhod prikazuje Vrstni red razrešitve metode Lagos, začenši od leve proti desni.

Pogoste pasti in najboljše prakse

Pri delu z super()obstaja nekaj pogostih pasti, ki se jim je treba izogniti.

  1. Upoštevajte vrstni red razrešitve metode, zlasti v scenarijih večkratnega dedovanja. Če morate uporabiti kompleksno večkratno dedovanje, morate poznati C3 Linearizacijski algoritem ki ga Python uporablja za določanje MRO.
  2. Izogibajte se krožnim odvisnostim v vaši hierarhiji razredov, ki lahko privedejo do nepredvidljivega vedenja.
  3. Jasno dokumentirajte svojo kodo, še posebej pri uporabi super() v zapletenih hierarhijah razredov, da bo bolj razumljiv drugim razvijalcem.

Uporabite super() na pravi način

Pythonov super() funkcija je zmogljiva funkcija, ko delate z dedovanjem in preglasitvijo metode. Razumeti, kako super() deluje in upoštevanje najboljših praks vam bo omogočilo ustvarjanje bolj vzdržljive in učinkovite kode v vaših projektih Python.