Utilizarea funcției super() în clasele Python

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 funcție super() 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() este util.

Puteți folosi funcția super() pentru a accesa atributele superclasei și pentru a invoca metodele superclasei. Super este esențial pentru programarea orientată pe obiect, deoarece facilitează implementarea moștenirii și înlocuirea metodei.

  Cum să introduceți zero înaintea unui număr în Foi de calcul Google

Cum funcționează super()?

Pe plan intern, super() este strâns legat de Ordinea de rezoluție a metodei (MRO) în Python, pe care o determină algoritmul de liniarizare C3.

Iată cum funcționează super():

  • Determinați clasa și instanța curentă: Când apelați 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ă self) .
  • 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 din Superclasă: Odată ce este determinată superclasa, super() vă permite să apelați metodele acesteia 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ă

    Utilizarea 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ă, de la care o moștenește o clasă Fiu:

     class Father:
        def __init__(self, first_name, last_name):
            self.first_name = first_name
            self.last_name = last_name

    class Son(Father):
        def __init__(self, first_name, last_name, age, hobby):
            
            super().__init__(first_name, last_name)

            self.age = age
            self.hobby = hobby

        def get_info(self):
            return f"Son's Name: {self.first_name} {self.last_name}, \
    Son's Age: {self.age}, Son's Hobby: {self.hobby}"


    son = Son("Pius", "Effiong", 25, "Playing Guitar")


    print(son.get_info())

    În interiorul constructorului Son, apelul la super().init() invocă constructorul clasei Father, trecându-i ca parametri first_name și last_name. Acest lucru asigură că clasa Tatăl poate seta în continuare atributele numelui corect, chiar și pe un obiect Fiu.

      Ce este sunetul separat al aplicației pe telefoanele Samsung și cum îl folosiți?

    Dacă nu apelați 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:

     ...
    class Son(Father):
        def __init__(self, first_name, last_name, age, hobby):
            self.age = age
            self.hobby = hobby
    ...

    Dacă încercați acum să apelați metoda get_info, aceasta va genera un AttributeError deoarece atributele self.first_name și self.last_name nu au fost inițializate.

    Folosind super() în Metodele de clasă

    Puteți folosi super() în alte metode, în afară de constructori, în același mod. Aceasta vă permite să extindeți sau să suprascrieți comportamentul metodei superclasei.

     class Father:
        def speak(self):
            return "Hello from Father"

    class Son(Father):
        def speak(self):
            
            parent_greeting = super().speak()
            return f"Hello from Son\n{parent_greeting}"


    son = Son()


    son_greeting = son.speak()

    print(son_greeting)

    Clasa Fiului moștenește de la Tatăl și are metoda ei de vorbire. Metoda speak a clasei Son folosește super().speak() pentru a apela metoda speak a clasei Father. Acest lucru îi permite să includă mesajul din clasa părinte în timp ce îl extinde cu un mesaj specific clasei copil.

    Eșecul utilizării 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, care 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.

     class Nigeria():
        def culture(self):
            print("Nigeria's culture")

    class Africa():
       def culture(self):
           print("Africa's culture")

    Iată ce se întâmplă când creați o instanță a clasei Lagos și apelați metoda culturii:

      Cum să reporniți un router în mod corect
  • Python începe prin a căuta metoda de cultură în clasa Lagos în sine. Dacă îl găsește, apelează metoda. Dacă nu, se trece la pasul doi.
  • Dacă nu găsește metoda de cultură în clasa Lagos, 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 din Africa și apoi din Nigeria. Deci, Python va căuta mai întâi metoda de cultură în Africa.
  • Dacă nu găsește metoda de cultură în clasa Africa, Python va căuta apoi în clasa Nigeria. 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 din Lagos, începând de la stânga la dreapta.

    Capcane comune și bune practici

    Când lucrați 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 când utilizați super() în ierarhii de clase complexe, pentru a-l face mai ușor de înțeles pentru alți dezvoltatori.
  • Utilizați super() în modul corect

    Funcția super() a lui Python este o caracteristică puternică atunci când lucrați cu moștenirea și modificarea metodei. Înțelegerea modului în care funcționează super() ș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.