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.
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.
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.