Moștenirea este utilă, dar îi puteți debloca întregul potențial prin reutilizarea codului din clasele de bază.
Recomandări cheie
- Funcția super() a lui Python vă permite să apelați metode de superclasă dintr-o subclasă, facilitând implementarea moștenirii și suprascrierii metodei.
- Funcția super() este strâns legată de Ordinea de rezoluție a metodei (MRO) din Python, care determină ordinea în care clasele strămoși sunt căutate pentru metode sau atribute.
- Utilizarea super() în constructorii de clasă este o practică obișnuită pentru a inițializa atribute comune în clasa părinte și pe altele mai specifice în clasa copil. Neutilizarea super() poate duce la consecințe nedorite, cum ar fi lipsa inițializărilor de atribute.
Una dintre caracteristicile de bază ale Python este paradigma sa OOP, pe care o puteți folosi pentru a modela entități din lumea reală și relațiile lor.
Când lucrați cu clase Python, veți folosi adesea moștenirea și veți suprascrie atributele sau metodele unei superclase. Python oferă o super() funcție care vă permite să apelați metodele superclasei din subclasă.
Ce este super() și de ce ai nevoie de el?
Folosind moștenirea, puteți crea o nouă clasă Python care moștenește caracteristicile unei clase existente. De asemenea, puteți suprascrie metodele superclasei din subclasă, oferind implementări alternative. Cu toate acestea, este posibil să doriți să utilizați noua funcționalitate în plus față de cea veche, mai degrabă decât în locul acesteia. În acest caz, super() e folositor.
Puteți folosi super() funcție pentru a accesa atributele superclasei și a invoca metodele superclasei. Super este esențial pentru programare orientată pe obiecte deoarece facilitează implementarea moștenirii și suprascrierii metodei.
Cum funcționează super()?
Intern, super() este strâns legată de Ordinul de rezolvare a metodei (MRO) în Python, pe care algoritmul de liniarizare C3 îl determină.
Iată cum super() lucrări:
- Determinați clasa și instanța curente: Când suni super() în interiorul unei metode a unei subclase, Python descoperă automat clasa curentă (clasa care conține metoda care a apelat super()) și instanța acelei clase (adică, de sine).
- Determinați superclasa: super() ia două argumente — clasa curentă și instanța — pe care nu trebuie să le transmiteți în mod explicit. Folosește aceste informații pentru a determina superclasa pentru a delega apelul la metodă. Face acest lucru examinând ierarhia clasei și MRO.
- Invocați metoda pe Superclasă: Odată ce este determinată superclasa, super() vă permite să apelați metodele sale ca și cum le-ați apela direct din subclasă. Acest lucru vă permite să extindeți sau să suprascrieți metode în timp ce utilizați în continuare implementarea originală din superclasă.
Folosind super() într-un constructor de clasă
Folosind super() într-un constructor de clasă este o practică obișnuită, deoarece veți dori adesea să inițializați atribute comune în clasa părinte și altele mai specifice în copil.
Pentru a demonstra acest lucru, definiți o clasă Python, Tată, care a fiule clasa moștenește de la:
classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_nameclassSon(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 = hobbydefget_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())
În interiorul fiule constructor, apelul la super().init() invocă pe Tată constructor de clasă, trecându-l Nume și nume ca parametri. Acest lucru asigură că Tată clasa poate seta în continuare atributele numelui corect, chiar și pe a fiule obiect.
Dacă nu suni super() într-un constructor de clasă, constructorul clasei părinte nu va rula. Acest lucru poate duce la consecințe nedorite, cum ar fi lipsa inițializărilor de atribute sau configurarea incompletă a stării clasei părinte:
...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...
Dacă acum încercați să sunați la obtine informatii metoda, va ridica o AttributeError deoarece self.prenume și sine.nume atributele nu au fost inițializate.
Folosind super() în Metodele de clasă
Poți să folosești super() în alte metode, în afară de constructori, în același mod. Acest lucru vă permite să extindeți sau să suprascrieți comportamentul metodei superclasei.
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 fiule clasa moşteneşte de la Tată și are al lui vorbi metodă. The vorbi metoda de fiule utilizări de clasă super().vorbește() a apela la vorbi metoda de Tată clasă. Acest lucru îi permite să includă mesajul din clasa părinte în timp ce îl extinde cu un mesaj specific clasei copil.
Neutilizare super() într-o metodă care o înlocuiește pe alta înseamnă că funcționalitatea prezentă în metoda clasei părinte nu va avea efect. Acest lucru are ca rezultat o înlocuire completă a comportamentului metodei, ceea ce poate duce la un comportament pe care nu l-ați intenționat.
Înțelegerea ordinului de rezoluție a metodei
Ordinea de rezoluție a metodei (MRO) este ordinea în care Python caută clasele strămoși atunci când accesați o metodă sau un atribut. MRO îl ajută pe Python să determine ce metodă să apeleze atunci când există mai multe ierarhii de moștenire.
classNigeria():
defculture(self):
print("Nigeria's culture")
classAfrica():
defculture(self):
print("Africa's culture")
Iată ce se întâmplă când creați o instanță a fișierului Lagos clasă și sună la cultură metodă:
- Python începe prin a căuta cultură metoda în Lagos clasa în sine. Dacă îl găsește, apelează metoda. Dacă nu, se trece la pasul doi.
- Dacă nu găsește cultură metoda în Lagos clasa, Python se uită la clasele de bază în ordinea în care apar în definiția clasei. În acest caz, Lagos moşteneşte mai întâi de la Africa iar apoi din Nigeria. Deci, Python va căuta cultură metoda in Africa primul.
- Dacă nu găsește cultură metoda în Africa clasa, Python va căuta apoi în Nigeria clasă. Acest comportament continuă până când ajunge la sfârșitul ierarhiei și aruncă o eroare dacă nu poate găsi metoda în niciuna dintre superclase.
Rezultatul arată Ordinea de rezoluție a metodei Lagos, începând de la stânga la dreapta.
Capcane comune și bune practici
Când lucrezi cu super(), există câteva capcane comune de evitat.
- Fiți atenți la Ordinul de rezolvare a metodei, în special în scenariile de moștenire multiple. Dacă trebuie să utilizați moștenirea multiplă complexă, ar trebui să fiți familiarizat cu C3 Algoritm de liniarizare pe care Python îl folosește pentru a determina MRO.
- Evitați dependențele circulare în ierarhia clasei dvs., care pot duce la un comportament imprevizibil.
- Documentați-vă codul în mod clar, mai ales la utilizare super() în ierarhii complexe de clasă, pentru a le face mai ușor de înțeles pentru alți dezvoltatori.
Utilizați super() în modul corect
Al lui Python super() funcția este o caracteristică puternică atunci când lucrați cu moștenirea și modificarea metodei. Înțelegând cum super() funcționează și respectarea celor mai bune practici vă va permite să creați cod mai ușor de întreținut și mai eficient în proiectele dvs. Python.