Ce sunt metodele magice în Python și cum să le folosești

Una dintre caracteristicile mai puțin cunoscute, dar valoroase ale lui Python, este capacitatea de a implementa metode magice pe obiecte. Folosind metode magice, putem scrie cod mai curat, care este intuitiv și ușor de înțeles.

Cu metode magice, putem crea interfețe pentru a interacționa cu obiectele într-un mod care să pară mai pitonic. Acest articol vă va prezenta metodele magice, va discuta despre cele mai bune practici pentru crearea acestora și va explora metodele magice comune pe care le veți întâlni.

Ce sunt metodele magice?

Metodele magice sunt metode Python care definesc modul în care obiectele Python se comportă atunci când se efectuează operațiuni comune asupra lor. Aceste metode sunt definite distinct cu caractere de subliniere duble înainte și după numele metodei.

Ca rezultat, ele sunt numite în mod obișnuit metode dunder, ca în liniuța dublă. O metodă dunder obișnuită pe care ați întâlnit-o deja este metoda __init__() care este utilizată pentru definirea constructorilor de clasă.

De obicei, metodele dunder nu sunt menite să fie apelate direct în codul dvs.; mai degrabă, acestea vor fi apelate de interpret pe măsură ce programul rulează.

De ce sunt utile metodele magice?

Metodele magice sunt un concept util în programarea orientată pe obiecte în Python. Folosindu-le, specificați comportamentul tipurilor dvs. de date personalizate atunci când sunt utilizate cu operațiuni comune, încorporate. Aceste operațiuni includ:

🟢 Operații aritmetice

🟢 Operații de comparare

🟢 Operațiuni ciclului de viață

🟢 Operațiuni de reprezentare

Următoarea secțiune va discuta cum să implementați metode magice care definesc modul în care se comportă aplicația atunci când este utilizată în toate categoriile de mai sus.

Cum să definiți metodele magice

După cum am menționat mai devreme, metodele magice specifică comportamentul obiectelor. Ca atare, ele sunt definite ca parte a clasei obiectului. Deoarece fac parte din clasa obiectului, ei iau ca prim argument self, care este o referință la obiectul însuși.

  Cum se face o CĂUTARE V într-o foaie de calcul Excel

Ei pot prelua argumente suplimentare în funcție de modul în care vor fi apelați de interpret. Ele sunt, de asemenea, definite distinct cu două caractere de subliniere înainte și după numele lor.

Implementarea

Mare parte din ceea ce am discutat până acum pare teoretic și abstract. În această secțiune, vom implementa o clasă simplă Rectangle.

Această clasă va avea proprietăți de lungime și lățime. Folosind metoda __init__, puteți specifica aceste proprietăți la instanțiere. În plus, veți putea compara diferite dreptunghiuri pentru a vedea dacă este egal, mai mic sau mai mare decât altul folosind operatorii ==, < și >. În cele din urmă, dreptunghiul ar trebui să fie capabil să ofere o reprezentare cu șir semnificativă.

Configurarea mediului de codare

Pentru a urma această explicație, veți avea nevoie de un mediu de rulare Python. Puteți folosi unul local sau puteți utiliza compilatorul online tipstrick.ro Python.

Crearea clasei dreptunghi

Mai întâi, să începem prin a defini clasa Rectangle.

class Rectangle:
    pass

Crearea metodei constructorului

În continuare, să creăm prima noastră metodă magică, metoda constructorului de clasă. Această metodă va prelua înălțimea și lățimea și le va stoca ca atribute în instanța clasei.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

Crearea unei metode magice pentru reprezentarea șirurilor

În continuare, dorim să creăm o metodă care să permită clasei noastre să genereze un șir care poate fi citit de om pentru a reprezenta obiectul. Această metodă va fi apelată ori de câte ori apelăm funcția str() trecând într-o instanță a clasei Rectangle ca argument. Această metodă va fi apelată și atunci când apelați funcții care așteaptă un argument șir, cum ar fi funcția de imprimare.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

Metoda __str__() ar trebui să returneze un șir pe care doriți să îl reprezentați obiectul. În acest caz, returnăm un șir cu formatul Rectangle(, ) unde înălțimea și lățimea sunt dimensiunile stocate ale dreptunghiului.

Crearea de metode magice pentru operațiuni de comparare

În continuare, dorim să creăm operatori de comparație pentru operațiile egal cu, mai mic și mai mare decât. Aceasta se numește supraîncărcare a operatorului. Pentru a le crea, folosim metodele magice __eq__, __lt__ și, respectiv, __gt__. Aceste metode vor returna o valoare booleană după compararea zonelor dreptunghiurilor.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

    def __eq__(self, other):
        """ Checking for equality """
        return self.height * self.width == other.height * other.width

    def __lt__(self, other):
        """ Checking if the rectangle is less than the other one """
        return self.height * self.width < other.height * other.width

    def __gt__(self, other):
        """ Checking if the rectage is greater than the other one """
        return self.height * self.width > other.height * other.width

După cum puteți vedea, aceste metode iau doi parametri. Primul este dreptunghiul curent, iar al doilea este cealaltă valoare cu care este comparată. Această valoare poate fi o altă instanță dreptunghi sau orice altă valoare. Logica modului în care comparația și condițiile în care comparația va reveni adevărate depind în totalitate de tine.

  Cum să estompați o fotografie pe iPhone

Metode magice comune

În această secțiune următoare, vom discuta despre metodele magice comune pe care le veți întâlni și le veți folosi.

#1. Operatii aritmetice

Metodele magice aritmetice sunt apelate atunci când o instanță a clasei dvs. este plasată în partea stângă a unui semn aritmetic. Metoda va fi apelată cu două argumente, primul fiind o referire la instanță. A doua valoare este obiectul din dreapta semnului. Metodele și semnele sunt următoarele:

NameMethodSignDescriptionAddition__add__+Implementează adăugarea. Scădere__sub__–Implementează scăderea.Înmulțirea__mul__*Implementează multiplicareaDivision__div__/Implementează împărțirea.Floor division__floordiv__//Implementează împărțirea etajului.

#2. Operații de comparare

Ca și metodele magice aritmetice, aceste metode sunt apelate atunci când o instanță a clasei pentru care sunt definite este plasată în stânga operatorului de comparație. De asemenea, ca și metodele magice aritmetice, ele sunt numite cu doi parametri; prima este o referire la instanța obiectului. Al doilea este o referire la valoarea din partea dreaptă a semnului.

NameMethodSignDescriptionLess than__lt__Implementează comparația mai mică sau egală cu comparisonEqual to__eq__==Implementează valoarea egală cu comparisonLess than or equal to__le__>=Implementează valoarea mai mică sau egală cu comparația

#3. Operațiuni ciclului de viață

Aceste metode vor fi apelate ca răspuns la diferitele metode ale ciclului de viață ale unui obiect, cum ar fi instanțierea sau ștergerea. Constructorul, __init__ se încadrează în această categorie. Metodele comune din această categorie sunt enumerate în tabelul de mai jos:

NameMethodDescriptionConstructor__init__Această metodă este apelată ori de câte ori un obiect din clasa pentru care este definit este șters. Poate fi folosit pentru a efectua acțiuni de curățare, cum ar fi închiderea oricăror fișiere deschise.Deletion__del__Această metodă este apelată ori de câte ori un obiect din clasa pentru care este definit este șters. Poate fi folosit pentru a efectua acțiuni de curățare, cum ar fi închiderea oricăror fișiere pe care le-a deschis. New__new__Metoda __new__ este apelată mai întâi atunci când este instanțiat un obiect din clasa specificată. Această metodă este apelată înaintea constructorului și preia clasa precum și orice argument suplimentar. Returnează o instanță a clasei. În cea mai mare parte, nu este prea util, dar este tratat în detaliu aici.

  Samsung Galaxy Watch 6 Series Review: Mai mult la fel

#4. Operațiuni de reprezentare

NameMethodDescriptionStr__str__Returnează o reprezentare șir care poate fi citită de om a obiectului. Această metodă este apelată atunci când apelați funcția str(), trecând o instanță a clasei ca argument. Este de asemenea apelat atunci când treceți în instanță la funcțiile print() și format(). Este menit să furnizeze un șir care este înțeles de utilizatorul final al aplicației.Repr__repr__Returnează o reprezentare șir a obiectului care este utilizat de dezvoltator. În mod ideal, șirul returnat ar trebui să fie bogat în informații, astfel încât să puteți construi o instanță identică a obiectului doar din șirul.

Cele mai bune practici pentru crearea de metode magice

Metodele magice sunt incredibile și vă vor simplifica codul. Cu toate acestea, este important să țineți cont de următoarele lucruri atunci când le utilizați.

  • Folosiți-le cu moderație – Implementarea prea multor metode magice în cursurile dvs. face codul dvs. greu de înțeles. Limitează-te la implementarea doar a celor esențiale.
  • Asigurați-vă că înțelegeți implicațiile de performanță ale unor metode precum __setatrr__ și __getattr__ înainte de a le folosi.
  • Documentați comportamentul metodelor dvs. magice, astfel încât alți dezvoltatori să știe exact ce fac. Acest lucru le face mai ușor să le folosească și să depaneze atunci când este necesar.

Cuvinte finale

În acest articol, am introdus metode magice ca o modalitate de a face clase care pot fi folosite cu operațiuni încorporate. De asemenea, am discutat despre cum sunt definite și am trecut printr-un exemplu de clasă pe care au implementat-o ​​metodele magice. În continuare, am menționat diferitele metode pe care probabil le veți folosi și de care aveți nevoie înainte de a împărtăși câteva bune practici de reținut.

În continuare, poate doriți să învățați cum să implementați clasa Counter în Python.