metode magice în Python, de exemplu

pentru imagine, multumim www..com

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.

How to call the magic methods, getitem, setitem and delitem

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.

__mul__ este o metodă din clasa mycustomlist. Aici, este prezentat izolat.

operatorul de multiplicare * se rezolvă la un apel __mul__ magic method, pe care îl putem personaliza pentru a returna comportamentul dorit.

întregul cod sursă pentru clasa utilizată în acest exemplu, MyCustomList este prezentat mai jos:

exemplu Bonus: Metoda__ call _ _ magic

pentru a termina, voi ilustra modul în care metoda __call__ magic în Python poate fi invocată. __call__ poate fi deosebit de util în clasele cu instanțe care trebuie să-și schimbe adesea starea. „Apelarea” instanței poate fi un mod intuitiv și elegant de a schimba starea obiectului.

luați în considerare exemplul prezentat. Aici, clasa MyClass are un constructor init care se așteaptă trei argumente trecut. Aceste trei argumente pot fi transmise în semnătura metodei init și atribuite ca atribute în obiect.

metoda call magic este utilă atunci când dorim să schimbăm starea unei instanțe, fără a crea de fapt o nouă instanță.

când instanța este inițializată pentru prima dată, trec în numerele întregi 1, 2 și 3, care sunt atribuite ca atribute var_1, var_2 și, respectiv, var_3 în instanță. Când folosesc instrucțiunea print pentru a afișa ieșirea instanței, obj, utilizând atributul _ _ dict__, pot vedea că var_1 i se atribuie valoarea 1, var_2 i se atribuie valoarea 2 și var_3 i se atribuie valoarea 3.

acum, să propunem că aș dori să schimb valorile atributelor var_1 și var_2 ale acestei instanțe, păstrând în același timp atributul var_3 așa cum a fost atunci când instanța a fost construită inițial.

pentru a face acest lucru este simplu. Definesc o metodă magică de apel, care permite redefinirea atributelor var_1 și var_2. Metodele magice pot fi apelate implicit, ceea ce înseamnă că pur și simplu apelez obj(200, 300), iar metoda de apel va fi invocată. Desigur, este posibilă și invocarea metodei de apel în mod explicit, de ex.obj.__call_ _ (200, 300), dar prima metodă pare mai intuitivă. În cele din urmă, în scopuri demonstrative, am tipărit ID-ul instanței pentru a arăta cu siguranță că am manipulat același obiect.

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată.