magiska metoder i Python, genom exempel

bild med tillstånd av www..com

ändra inbyggt beteende med magiska metoder

magiska metoder är speciella metoder som du kan definiera för att lägga till ”magi” i dina klasser. De är alltid omgivna av dubbla understreck, till exempel __init__ och __str__ magiska metoder. Magiska metoder kan berika vår klassdesign genom att ge oss tillgång till Pythons inbyggda syntaxfunktioner.

Python låter våra klasser ärva från inbyggda klasser. En ärvande barnklass av en inbyggd delar alla samma attribut, inklusive metoder som den inbyggda. Vi kan dra nytta av kärn inbyggd funktionalitet, men anpassa utvalda operationer med hjälp av magiska metoder.

i denna handledning kommer jag att knyta dessa två ideer tillsammans för att visa hur vi kan ärva från den inbyggda listklassen och använda magiska metoder i vår klassdesign. Jag kommer att ändra de tre magiska metoder som styr listan indexering. Genom att kombinera båda dessa funktioner kan en klass som är mycket enkel att använda konstrueras och vi kan lägga till beteende i metoder vi önskar. Inbyggt beteende är bekant för alla Python-utvecklare; i sin tur använder detta vår ärvande klass lätt att lära sig.

slutligen kommer två ytterligare bredare exempel som illustrerar hur magiska metoder kan användas i sändningsoperationer och ändra en instans tillstånd att demonstreras. All medföljande kod är tillgänglig via GitHub.

exempel 1: Lista indexering

magiska metoder kan manipuleras för att ändra listan indexering. Klassen MyCustomList, ärver från den inbyggda listtypen. Detta innebär att alla objekt som skapas via mycustomlist-klassen kommer att bete sig som en lista, utom på de platser där vi väljer att selektivt anpassa metoder.

getitem, setitem och delitem är magiska metoder som åberopas när vi öppnar listindexet. Beteendet hos dessa magiska metoder kan modifieras.

i exemplet nedan förkastar vi tanken på listindexering som börjar vid zeroth-indexet. Om användaren försöker komma åt ett element från vår lista med zeroth-indexet kommer ett ValueError-undantag att höjas och programmet avslutas. Om användaren går in i ett listindex som är större än ett, kommer metoderna att minska indexet med en och sedan ringa den överordnade klasslistan med indexet.

för att visa hur dessa metoder som definieras i klassen MyCustomList används, se nedan i Python interactive prompt.

exemplet visar hur getitem, setitem och delitem kan anropas. Magiska metoder kan kallas implicit. För _ _ getitem__, för att komma åt det första indexet, skriv bara namnet på objektet följt av indexpositionen i kvadratkonsoler.

det som är mest intressant är att när vi ber om elementet vid indexposition 1 returneras heltalsvärdet 1, även om 1 är nollelementet. Vad vi har här är en lista som börjar det indexering börjar vid 1. Faktum är att det kompenserar för den förvirring som vi alla har haft när vi först lärde oss listindexering.

låt oss nu ändra heltalsvärdet 1 i listan till 100. För att göra detta måste vi åberopa setitem. För att göra detta skriver vi helt enkelt namnet på objektet, följt av fyrkantiga parenteser och en uppgift. Återigen, för att ändra det första elementet i listan använder vi indexposition 1. När vi matar ut listan igen kan vi tydligt se att det första elementet har ändrats från 1 till 100.

slutligen, för att ta bort ett element från listan __delitem__ kan definieras. __ Delitem _ _ magic-metoden åberopas när vi använder del python-nyckelordet som löser sig till __delitem__ metodsamtal. För att ytterligare bygga vidare på vår lista indexering exempel, kan ta bort det första elementet i indexet, heltalsvärdet 100. När vi kallar del, följt av objektet och indexpositionen för det element vi vill ta bort, i det här exemplet, det första elementet i listan 100, kan vi nu se att 100 faktiskt har tagits bort!

magiska metoder erbjuder chansen att ändra standardbeteende. Bäst av allt, det finns inget behov av att lära sig nya metodnamn eller ett nytt gränssnitt, så metoderna kan implementeras intuitivt. En guide för att använda dessa magiska metoder implementerade i MyCustomList anges i tabellen nedan.

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

Example 2: Den__ mul _ _ magiska metoden

Vi kan också använda multiplikationsoperatören i vår klassdesign. Eftersom vi ärver från den inbyggda listklassen kan vi zip två MyCustomList-objekt tillsammans (eftersom de fungerar som listobjekt) och iterera genom zip-objektet. Under iterationerna kan vi multiplicera elementen i varje lista med motsvarande element i den andra listan på ett sändningsmode (se __mul__ magic method code snippet nedan). Detta sändningsbeteende liknar det som finns i dataanalyspaket som Pandas och Numpy.

exemplet visar att vi kan multipla två mycustomlist-objekt tillsammans med * – tecknet. Om vi fångar det returnerade värdet i en variabel som heter list_three och skriv ut list_three, matas en ny lista ut. Denna lista är produkten av att multiplicera elementen mot varandra från de andra 2 listorna.

__mul__ är en metod från mycustomlist-klassen. Här visas det isolerat.

multiplikationsoperatören * löser sig till ett __mul__ Magic method call, som vi kan anpassa för att returnera det beteende vi önskar.

hela källkoden för klassen som används i detta exempel, MyCustomList visas nedan:

exempel Bonus: __ Call _ _ magic-metoden

för att avsluta kommer jag att illustrera hur__ call _ _ magic-metoden i Python kan åberopas. __call__ kan vara särskilt användbart i klasser med instanser som ofta behöver ändra sitt tillstånd. Att” ringa ” instansen kan vara ett intuitivt och elegant sätt att ändra objektets tillstånd.

Tänk på exemplet som visas. Här har klassen MyClass en init-konstruktör som förväntar sig tre argument passerade. Dessa tre argument kan skickas i init-metodens signatur och tilldelas som attribut i objektet.

Call magic-metoden är användbar när vi vill ändra en instans tillstånd, utan att faktiskt skapa en ny instans.

när instansen först initialiseras passerar jag i heltalen 1, 2 och 3, som tilldelas som attribut var_1, var_2 och var_3 i respektive instans. När jag använder utskriftssatsen för att visa utmatningen från instansen, obj, med hjälp av attributet __dict__, kan jag se att var_1 tilldelas värdet 1, var_2 tilldelas värdet 2 och var_3 tilldelas värdet 3.

låt oss nu föreslå att jag skulle vilja ändra den här instansens var_1-och var_2-attributvärden, samtidigt som var_3-attributet var som det var när instansen ursprungligen konstruerades.

att göra detta är enkelt. Jag definierar en call magic-metod, som tillåter att attributen var_1 och var_2 omdefinieras. Magiska metoder kan kallas implicit, vilket innebär att jag helt enkelt kallar obj(200, 300), och samtalsmetoden kommer att åberopas. Naturligtvis är det också möjligt att uttryckligen åberopa samtalsmetoden, t.ex.__ Ring__(200, 300), men den första metoden verkar mer intuitiv. Slutligen, för demonstrationsändamål, har jag skrivit ut instansens id för att definitivt visa att vi har manipulerat samma objekt.

samtalsmetoden kan definieras på två sätt. Argumenten kan antingen skickas direkt till anropsmetoden. Alternativt kan argumentet * vars användas, vilket fångar alla argument som passerat och lagrar dem i en tupel, som kan packas upp som visas ovan.

källkoden för detta exempel finns nedan.

sammanfattning

magiska metoder kan berika vår klassdesign genom att ge oss tillgång till kärnsyntaxfunktioner. I de första exemplen har vi det bästa av två världar. Vi kan ärva från den inbyggda listklassen och ändra vissa metoder i den klassen för att anpassa beteende. getitem, setitem och delitem modifierades alla, men genom arv kunde vi fortfarande använda listans inbyggda init-och repr () – metoder till exempel.

Vi kan kommunicera användningen av objekten extremt enkelt till andra utvecklare. I det angivna exemplet är allt vi behöver berätta för våra medutvecklare att vår klass fungerar som en lista, bara lite annorlunda, här förkastar vi tanken på ett zeroth-index. Det finns ingen anledning att lära sig nya metoder namn eller ett nytt gränssnitt.

dessutom demonstrerades call magic-metoden. Att ringa instansen kan vara ett intuitivt och elegant sätt att ändra objektets tillstånd.

Lämna ett svar

Din e-postadress kommer inte publiceras.