Endre Innebygd Oppførsel ved Hjelp Av Magiske Metoder
Magiske metoder Er spesielle metoder som du kan definere for å legge til «magi» i klassene dine. De er alltid omgitt av doble understreker, for eksempel de __init__ og __str__ magiske metodene. Magiske metoder kan berike vår klassedesign ved å gi oss tilgang Til Pythons innebygde syntaksfunksjoner.
Python lar våre klasser arve fra innebygde klasser. En arvelig barneklasse av en innebygd aksjer alle de samme attributter, inkludert metoder som den innebygde. Vi kan dra nytte av kjerne innebygd funksjonalitet, men tilpasse utvalgte operasjoner gjennom bruk av magiske metoder.I denne opplæringen vil jeg knytte disse to ideene sammen for å vise hvordan vi kan arve fra den innebygde listeklassen og gjøre bruk av magiske metoder i vår klassedesign. Jeg vil endre de tre magiske metodene som styrer listeindeksering. Ved å kombinere begge disse funksjonene, kan en klasse som er veldig enkel å bruke konstrueres, og vi kan legge til atferd til metoder vi ønsker. Innebygd oppførsel er kjent for Alle Python-utviklere; i sin tur gjør dette bruk av vår arveklasse lett å lære.til slutt vil to ytterligere bredere eksempler som illustrerer hvordan magiske metoder kan brukes i kringkastingsoperasjoner og endre en forekomsts tilstand, bli demonstrert. All tilhørende kode er tilgjengelig via GitHub.
Eksempel 1: Liste indeksering
Magiske metoder kan manipuleres for å endre liste indeksering. Klassen MyCustomList, arver fra den innebygde listetypen. Dette betyr at ethvert objekt som er opprettet Gjennom MyCustomList-klassen, vil oppføre seg som en liste, unntatt på de stedene hvor vi velger å selektivt tilpasse metoder.
getitem, setitem og delitem er magiske metoder som påberopes når vi får tilgang til listeindeksen. Oppførselen til disse magiske metodene kan endres.
i eksemplet som vises nedenfor, forkaster vi ideen om listeindeksering som begynner på nullindeksen. Hvis brukeren forsøker å få tilgang til et element fra vår liste ved hjelp av zeroth index, vil En ValueError unntak heves og programmet avsluttes. Hvis brukeren angir en listeindeks som er større enn en, vil metodene redusere indeksen med en, og deretter ringe til overordnet klasseliste med indeksen.
for å vise hvordan disse metodene definert I MyCustomList-klassen brukes, se nedenfor I Python interactive prompt.
eksemplet viser hvordan getitem, setitem og delitem kan kalles. Magiske metoder kan kalles implisitt. For _ _ getitem__, for å få tilgang til den første indeksen, skriv bare navnet på objektet etterfulgt av indeksposisjonen i firkantede parenteser.det som er mest interessant ,er at når vi ber om elementet i indeksposisjon 1, returneres heltallsverdien 1, selv om 1 er nullelementet. Det vi har her er en liste som begynner det indeksering starter på 1. Faktisk, det er å gjøre opp for forvirringen som vi alle har hatt da vi først lært liste indeksering.
nå, la oss endre heltallverdien 1 i listen til 100. For å gjøre dette, må vi påberope setitem. For å gjøre dette skriver vi bare navnet på objektet, etterfulgt av firkantede parenteser og en oppgave. Igjen, for å endre det første elementet i listen bruker vi indeksposisjon 1. Når vi sender ut listen igjen, kan vi tydelig se at det første elementet har endret seg fra 1 til 100.
Til slutt, for å slette et element fra listen __delitem__ kan defineres. __ Delitem _ _ magic-metoden påberopes, når vi bruker del python-søkeordet som løser til__ delitem _ _ method call. For å bygge videre på vår liste indeksering eksempel, kan slette det første elementet i indeksen, heltallsverdien 100. Når vi kaller del, etterfulgt av objektet og indeksposisjonen til elementet vi vil slette, i dette eksemplet, det første elementet i listen 100, kan vi nå se at 100 faktisk er fjernet!
Magiske metoder gir muligheten til å endre standard oppførsel. Best av alt, det er ikke nødvendig å lære nye metodenavn eller et nytt grensesnitt, slik at metodene kan implementeres intuitivt. En guide til bruk av disse magiske metodene implementert I MyCustomList er spesifisert i tabellen nedenfor.
Example 2: Den__ mul _ _ magiske metoden
Vi kan også gjøre bruk av multiplikasjonsoperatøren i vår klassedesign. Siden vi arver fra den innebygde listeklassen, kan vi zip to MyCustomList-objekter sammen (fordi de fungerer som listobjekter) og iterere gjennom zip-objektet. Under iterasjonene kan vi multiplisere elementene i hver liste med det tilsvarende elementet i den andre listen på en kringkastingsmote (se __mul__ magic method code snippet nedenfor). Denne kringkastingsadferden ligner den som finnes i dataanalysepakker som Pandas og Numpy.
eksemplet viser at vi kan flere To MyCustomList-objekter sammen ved hjelp av * – tegnet. Hvis vi fanger den returnerte verdien i en variabel som heter list_three, og skriv ut list_three, vises en ny liste. Denne listen er produktet av å multiplisere elementene mot hverandre fra de andre 2 lister.
Hele kildekoden for klassen som brukes i dette eksemplet, mycustomlist er vist nedenfor:
Eksempel Bonus: _ _ Call _ _ magic method
for å fullføre, vil jeg illustrere hvordan __call__ magic-metoden i Python kan påberopes. __call__
kan være spesielt nyttig i klasser med forekomster som ofte må endre tilstanden. «Calling» forekomsten kan være en intuitiv og elegant måte å endre objektets tilstand.
Tenk på eksemplet som vises. Her har klassen MyClass en init-konstruktør som forventer tre argumenter bestått. Disse tre argumentene kan sendes i init-metodens signatur og tilordnes som attributter i objektet.
call magic-metoden er nyttig når vi vil endre en forekomsts tilstand, uten å opprette en ny forekomst.
når forekomsten først initialiseres, passerer jeg i heltallene 1, 2 og 3, som er tildelt som attributter var_1, var_2 og var_3 i henholdsvis forekomsten. Når jeg bruker print-setningen til å vise utdata av forekomsten, obj, ved å bruke __dict__ – attributtet, kan jeg se at var_1 er tildelt verdien 1, var_2 er tildelt verdien 2, og var_3 er tildelt verdien 3.Nå, la Oss foreslå at jeg vil endre denne forekomstens var_1 og var_2 attributtverdier, mens du beholder var_3-attributtet som det var da forekomsten ble opprinnelig konstruert.
å gjøre dette er enkelt. Jeg definerer en call magic-metode, som tillater var_1 og var_2 attributter å bli omdefinert. Magiske metoder kan kalles implisitt, noe som betyr at jeg bare kaller obj (200, 300), og anropsmetoden vil bli påkalt. Selvfølgelig er det også mulig å påkalle anropsmetoden eksplisitt, f.eks. obj.__call__(200, 300), men den første metoden virker mer intuitiv. Til slutt, for demonstrasjonsformål, har jeg skrevet ut instansens id for å definitivt vise at vi har manipulert det samme objektet.
anropsmetoden kan defineres på to måter. Argumentene kan enten sendes inn i anropsmetoden signatur direkte. Alternativt kan * vars-argumentet brukes, som fanger opp alle argumenter som er bestått og lagrer dem i en tuple,som kan pakkes ut som vist ovenfor.
kildekoden for dette eksemplet finner du nedenfor.
Oppsummering
Magiske metoder kan berike vår klassedesign ved å gi oss tilgang til kjernesyntaksfunksjoner. I de første eksemplene har vi det beste fra begge verdener. Vi kan arve fra den innebygde listeklassen, og endre bestemte metoder i den klassen for å tilpasse atferd. getitem, setitem, og delitem ble alle endret, men gjennom arv, vi var fortsatt i stand til å gjøre bruk av listen innebygde init og repr() metoder for eksempel.
vi kan kommunisere bruken av objektene ekstremt lett til andre utviklere. I eksemplet gitt, alt vi trenger å fortelle våre medutviklere er at vår klasse fungerer som en liste, bare litt annerledes, her forkaster vi ideen om en nullindeks. Det er ikke nødvendig å lære nye metoder navn eller et nytt grensesnitt.
i tillegg ble call magic-metoden demonstrert. Å ringe forekomsten kan være en intuitiv og elegant måte å endre objektets tilstand på.