Pärimine on kasulik, kuid saate selle täieliku potentsiaali avada, kui kasutate põhiklasside koodi uuesti.

Võtmed kaasavõtmiseks

  • Pythoni funktsioon super() võimaldab kutsuda alamklassist superklassi meetodeid, muutes pärimise ja meetodi alistamise juurutamise lihtsamaks.
  • Funktsioon super() on Pythonis tihedalt seotud Method Resolution Orderiga (MRO), mis määrab järjekorra, milles esivanemaklassidest meetodeid või atribuute otsitakse.
  • Super() kasutamine klassikonstruktorites on tavaklassi tavaliste atribuutide lähtestamiseks põhiklassis ja spetsiifilisemate atribuutide lähtestamiseks alamklassis. Super() kasutamise ebaõnnestumine võib põhjustada soovimatuid tagajärgi, näiteks puuduvad atribuudi lähtestused.

Pythoni üks põhifunktsioone on selle OOP-paradigma, mida saate kasutada reaalmaailma olemite ja nende suhete modelleerimiseks.

Pythoni klassidega töötades kasutate sageli pärimist ja alistate superklassi atribuudid või meetodid. Python pakub a Super() funktsioon, mis võimaldab kutsuda alamklassist superklassi meetodeid.

instagram viewer

Mis on super() ja miks sa seda vajad?

Pärimise abil saate luua uue Pythoni klassi, mis pärib olemasoleva klassi omadused. Samuti saate alamklassis alistada ülemklassi meetodeid, pakkudes alternatiivseid rakendusi. Siiski võite soovida kasutada uut funktsiooni lisaks vanale, mitte selle asemel. Sel juhul, Super() on kasulik.

Võite kasutada Super() funktsioon, et pääseda juurde superklassi atribuutidele ja kutsuda välja superklassi meetodeid. Super on hädavajalik objektorienteeritud programmeerimine sest see muudab pärimise ja meetodi alistamise juurutamise lihtsamaks.

Kuidas super() töötab?

Sisemiselt, Super() on tihedalt seotud Meetodi lahutusjärjekord (MRO) Pythonis, mille C3 lineariseerimisalgoritm määrab.

Siin on, kuidas Super() töötab:

  1. Määrake praegune klass ja eksemplar: Kui helistate Super() alamklassi meetodi sees arvutab Python automaatselt välja praeguse klassi (klassi, mis sisaldab meetodit, mis kutsus Super()) ja selle klassi eksemplar (st ise).
  2. Määrake superklass: Super() võtab kaks argumenti – praegune klass ja eksemplar –, mida te ei pea selgesõnaliselt edastama. Ta kasutab seda teavet superklassi määramiseks meetodi kutse delegeerimiseks. See teeb seda klassihierarhiat ja MRO-d uurides.
  3. Käivitage meetod superklassis: kui superklass on kindlaks määratud, Super() võimaldab kutsuda selle meetodeid nii, nagu kutsuksid neid otse alamklassist. See võimaldab teil meetodeid laiendada või alistada, kasutades samal ajal superklassi algset teostust.

Super() kasutamine klassikonstruktoris

Kasutades Super() klassi konstruktoris on tavaline praktika, kuna sageli soovite lähtestada põhiklassis levinud atribuudid ja lapse spetsiifilisemad atribuudid.

Selle demonstreerimiseks määratleda Pythoni klass, Isa, mis a Poeg klass pärib:

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

Sees Poeg ehitaja, kutse super().init() kutsub esile Isa klassi konstruktor, läbides selle eesnimi ja perekonnanimi parameetritena. See tagab, et Isa klass saab ikkagi määrata nimeatribuudid õigesti, isegi a Poeg objektiks.

Kui te ei helista Super() klassi konstruktoris ei tööta selle ülemklassi konstruktor. See võib kaasa tuua soovimatuid tagajärgi, nagu puuduvad atribuudi lähtestused või vanemklassi oleku mittetäielik seadistus:

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

Kui proovite nüüd helistada hanki_info meetodil, tõstab see an AttributeError sest ise.eesnimi ja ise.perenimi atribuute pole lähtestatud.

Super() kasutamine klassimeetodites

Sa võid kasutada Super() muudel meetoditel, peale konstruktorite, samamoodi. See võimaldab teil superklassi meetodi käitumist laiendada või alistada.

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 Poeg klass pärib alates Isa ja sellel on oma räägi meetod. The räägi meetod Poeg klassikasutusi super().speak() helistada räägi meetod Isa klass. See võimaldab sellel lisada vanemklassi sõnumit ja laiendada seda alamklassile omase sõnumiga.

Kasutamise ebaõnnestumine Super() meetodi puhul, mis alistab mõne muu, tähendab, et põhiklassi meetodi funktsioon ei rakendu. Selle tulemuseks on meetodi käitumise täielik asendamine, mis võib viia käitumiseni, mida te ei kavatsenud.

Meetodi lahutusjärjestuse mõistmine

Method Resolution Order (MRO) on järjekord, milles Python otsib esivanemate klasse, kui avate meetodi või atribuudi. MRO aitab Pythonil määrata, millist meetodit mitme pärimishierarhia korral kutsuda.

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

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

Siin on, mis juhtub, kui loote eksemplari Lagos klassi ja helistage kultuur meetod:

  1. Python alustab otsimisega kultuur meetodis Lagos klass ise. Kui ta selle leiab, kutsub ta meetodi välja. Kui ei, liigub see teise sammu juurde.
  2. Kui see ei leia kultuur meetodis Lagos klassis, Python vaatleb baasklasse nende klasside määratluses esinemise järjekorras. Sel juhul, Lagos pärib kõigepealt Aafrika ja siis alates Nigeeria. Niisiis, Python otsib kultuur meetod sisse Aafrika esiteks.
  3. Kui see ei leia kultuur meetodis Aafrika klassis, otsib Python seejärel sisse Nigeeria klass. Selline käitumine jätkub, kuni jõuab hierarhia lõppu ja annab veateate, kui ei leia meetodit ühestki ülemklassist.

Väljund näitab meetodi eraldusvõime järjekorda Lagos, alustades vasakult paremale.

Levinud lõksud ja parimad tavad

Töötades koos Super(), tuleb vältida mõningaid levinud lõkse.

  1. Pidage meeles meetodi lahendamise järjekorda, eriti mitme pärimise stsenaariumi korral. Kui teil on vaja kasutada keerulist mitmikpärimist, peaksite olema tuttav C3 Lineariseerimisalgoritm mida Python kasutab MRO määramiseks.
  2. Vältige klassihierarhias ringsõltuvusi, mis võivad viia ettearvamatu käitumiseni.
  3. Dokumenteerige oma kood selgelt, eriti kasutamisel Super() keerukates klassihierarhiates, et see oleks teistele arendajatele arusaadavam.

Kasutage super() õigel viisil

Pythoni oma Super() funktsioon on võimas funktsioon, kui töötate pärimise ja meetodi alistamisega. Arusaamine, kuidas Super() töötab ja parimate tavade järgimine võimaldab teil Pythoni projektides luua paremini hooldatavat ja tõhusamat koodi.