schimbarea comportamentului încorporat folosind metode magice
metodele magice sunt metode speciale pe care le puteți defini pentru a adăuga „magie” la clasele dvs. Ele sunt întotdeauna înconjurate de sublinieri duble, de exemplu, metodele magice __init__ și __str__. Metodele magice pot îmbogăți designul clasei noastre, oferindu-ne acces la caracteristicile de sintaxă încorporate ale Python.
Python permite claselor noastre să moștenească din clasele încorporate. O clasă de copii moștenitoare a unui built-in împărtășește toate aceleași atribute, inclusiv metode ca și built-in. Putem profita de funcționalitatea încorporată de bază, dar personalizăm operațiunile selectate prin utilizarea metodelor magice.
în acest tutorial, voi lega aceste două idei împreună pentru a prezenta modul în care putem moșteni din clasa listă built-in și să facă uz de metode magice în designul nostru de clasă. Voi modifica cele trei metode magice care controlează indexarea listei. Prin combinarea ambelor caracteristici, se poate construi o clasă foarte simplă de utilizat și putem adăuga comportament metodelor pe care le dorim. Comportamentul încorporat este familiar tuturor dezvoltatorilor Python; la rândul său, acest lucru face ca utilizarea clasei noastre moștenitoare să fie ușor de învățat.
în cele din urmă, vor fi demonstrate două exemple mai largi care ilustrează modul în care metodele magice pot fi utilizate în operațiunile de difuzare și schimbarea stării unei instanțe. Tot codul de însoțire este disponibil prin GitHub.
Exemplul 1: Lista de indexare
metode magice pot fi manipulate pentru a modifica lista de indexare. Clasa MyCustomList, moștenește de la tipul de listă încorporat. Aceasta înseamnă că orice obiect creat prin clasa MyCustomList se va comporta ca o listă, cu excepția locurilor în care alegem să personalizăm selectiv metodele.getitem, setitem și delitem sunt metode magice care sunt invocate atunci când accesăm indexul listei. Comportamentul acestor metode magice poate fi modificat.
în exemplul afișat mai jos, renunțăm la ideea indexării listelor începând cu indicele zero. Dacă utilizatorul încearcă să acceseze un element din lista noastră folosind indexul zeroth, o excepție ValueError va fi ridicată și programul se va termina. Dacă utilizatorul introduce un index de listă mai mare de unul, metodele vor reduce indicele cu unul, apoi vor apela lista de clase părinte cu indexul.
pentru a prezenta modul în care sunt utilizate aceste metode definite în clasa MyCustomList, vedeți mai jos în promptul interactiv Python.
exemplul arată cum pot fi numite getitem, setitem și delitem. Metodele magice pot fi numite implicit. Pentru _ _ getitem__, pentru a accesa primul index, pur și simplu scrieți numele obiectului urmat de poziția indexului între paranteze pătrate.
ceea ce este cel mai interesant, este că atunci când cerem elementul la poziția indexului 1, valoarea întreagă 1 este returnată, chiar dacă 1 este elementul zero. Ceea ce avem aici este o listă care începe este indexarea începând de la 1. De fapt, este de a face pentru confuzia pe care am avut-o cu toții când am învățat prima listă de indexare.
acum, să schimbăm valoarea întreagă 1 din listă la 100. Pentru a face acest lucru, trebuie să invocăm setitem. Pentru a face acest lucru, scriem pur și simplu numele obiectului, urmat de paranteze pătrate și o sarcină. Din nou, pentru a schimba primul element din listă folosim poziția index 1. Când scoatem din nou lista, putem vedea clar că primul element s-a schimbat de la 1 la 100.
în cele din urmă, pentru a șterge un element din listă __delitem__ poate fi definit. Metoda__ delitem _ _ magic este invocată atunci când folosim cuvântul cheie del python care se rezolvă la apelul__ delitem _ _ method. Pentru a construi în continuare pe exemplul nostru de indexare a listei, permite ștergerea primului element din index, valoarea întreagă 100. Când apelăm del, urmat de obiectul și poziția index a elementului pe care dorim să îl ștergem, în acest exemplu, primul element din lista 100, putem vedea acum că 100 a fost de fapt eliminat!
metodele magice oferă șansa de a modifica comportamentul implicit. Cel mai bine, nu este nevoie să învățați nume noi de metode sau o nouă interfață, astfel încât metodele să poată fi implementate intuitiv. Un ghid pentru utilizarea acestor metode magice implementate în MyCustomList este specificat în tabelul de mai jos.
Example 2: Metoda__ mul _ _ magic
putem folosi și operatorul de multiplicare în designul clasei noastre. Din moment ce moștenim din clasa listă încorporată, putem zip două obiecte MyCustomList împreună (deoarece acestea acționează ca obiecte listă) și itera prin obiectul zip. În timpul iterațiilor, putem multiplica elementele din fiecare listă cu elementul său corespunzător din cealaltă listă într-un mod difuzat (vezi __mul__ Magic method Cod fragment de mai jos). Acest comportament de difuzare este similar cu cel găsit în pachetele de analiză a datelor, cum ar fi Panda și Numpy.
exemplul arată că putem multiplica două obiecte MyCustomList împreună folosind semnul*. Dacă vom captura valoarea returnată într-o variabilă numită list_three, și list_three imprimare, o nouă listă este de ieșire. Această listă este produsul înmulțirii elementelor unul împotriva celuilalt din celelalte 2 liste.
metoda de apel poate fi definită în două moduri. Argumentele pot fi transmise direct în semnătura metodei de apel. Alternativ, argumentul * vars poate fi utilizat, care surprinde toate argumentele transmise și le stochează într-un tuplu, care poate fi despachetat așa cum se arată mai sus.
codul sursă pentru acest exemplu poate fi găsit mai jos.
rezumat
metodele magice ne pot îmbogăți designul clasei oferindu-ne acces la caracteristicile de sintaxă de bază. În primele exemple, avem cele mai bune din ambele lumi. Putem moșteni din clasa listă încorporată și putem modifica anumite metode din acea clasă pentru a personaliza comportamentul. getitem, setitem, și delitem au fost toate modificate, dar prin moștenire, am fost încă în măsură să facă uz de lista built-in init și repr() metode de exemplu.
putem comunica utilizarea obiectelor extrem de ușor colegilor Dezvoltatori. În exemplul oferit, tot ce trebuie să le spunem colegilor noștri Dezvoltatori este că clasa noastră acționează ca o listă, doar puțin diferit, aici renunțăm la ideea unui indice zero. Nu este nevoie de a învăța noi metode de nume sau o nouă interfață.
în plus, a fost demonstrată metoda call magic. Apelarea instanței poate fi un mod intuitiv și elegant de a schimba starea obiectului.