ændring af indbygget adfærd ved hjælp af magiske metoder
magiske metoder er specielle metoder, som du kan definere for at tilføje ‘magi’ til dine klasser. De er altid omgivet af dobbelt understregninger, for eksempel __init__ og __str__ magiske metoder. Magiske metoder kan berige vores klassedesign ved at give os adgang til Pythons indbyggede syntaksfunktioner.Python lader vores klasser arve fra indbyggede klasser. En arvelig barneklasse af en indbygget deler alle de samme attributter, herunder metoder som den indbyggede. Vi kan drage fordel af core indbygget funktionalitet, men tilpasse udvalgte operationer ved hjælp af magiske metoder.
i denne tutorial vil jeg binde disse to ideer sammen for at vise, hvordan vi kan arve fra den indbyggede listeklasse og gøre brug af magiske metoder i vores klassedesign. Jeg vil ændre de tre magiske metoder, der styrer listeindeksering. Ved at kombinere begge disse funktioner kan en klasse, der er meget enkel at bruge, konstrueres, og vi kan tilføje adfærd til metoder, vi ønsker. Indbygget adfærd er kendt for alle Python-udviklere; til gengæld gør dette brug af vores arveklasse let at lære.
endelig vil to yderligere bredere eksempler, der illustrerer, hvordan magiske metoder kan bruges i udsendelsesoperationer og ændre en instans tilstand, blive demonstreret. Al ledsagende kode er tilgængelig via GitHub.
eksempel 1: Liste indeksering
magiske metoder kan manipuleres til at ændre listen indeksering. Klassen MyCustomList, arver fra den indbyggede listetype. Dette betyder, at ethvert objekt, der oprettes gennem MyCustomList-klassen, opfører sig som en liste, undtagen på de steder, hvor vi vælger selektivt at tilpasse metoder.
getitem, setitem og delitem er magiske metoder, der påberåbes, når vi får adgang til listeindekset. Opførelsen af disse magiske metoder kan ændres.
i eksemplet nedenfor kasserer vi ideen om listeindeksering, der begynder ved nulindekset. Hvis brugeren forsøger at få adgang til et element fra vores liste ved hjælp af nulindekset, hæves en ValueError-undtagelse, og programmet afsluttes. Hvis brugeren indtaster et listeindeks, der er større end et, reducerer metoderne indekset med et og kalder derefter den overordnede klasseliste med indekset.
for at vise, hvordan disse metoder, der er defineret i MyCustomList-klassen, bruges, se nedenfor i Python interactive prompt.
eksemplet viser, hvordan getitem, setitem og delitem kan kaldes. Magiske metoder kan kaldes implicit. For _ _ getitem__, for at få adgang til det første indeks, skal du blot skrive navnet på objektet efterfulgt af indekspositionen i firkantede parenteser.
det, der er mest interessant, er, at når vi beder om elementet i indeksposition 1, returneres heltalsværdien 1, selvom 1 er nulelementet. Hvad vi har her er en liste, der begynder det indeksering starter ved 1. Faktisk kompenserer det for den forvirring, som vi alle har haft, da vi først lærte listeindeksering.
lad os nu ændre heltalsværdien 1 på listen til 100. For at gøre dette skal vi påberåbe setitem. For at gøre dette skriver vi blot navnet på objektet efterfulgt af firkantede parenteser og en opgave. Igen, for at ændre det første element i listen bruger vi indeksposition 1. Når vi udsender listen igen, kan vi tydeligt se, at det første element er ændret fra 1 til 100.
endelig for at slette et element fra listen__ delitem _ _ kan defineres. __ Delitem _ _ magic-metoden påberåbes, når vi bruger del python-nøgleordet, der løser __delitem__ – metodekaldet. For yderligere at bygge videre på vores listeindekseringseksempel, lad os slette det første element i indekset, heltalsværdien 100. Når vi kalder del, efterfulgt af objektet og indekspositionen for det element, vi vil slette, i dette eksempel det første element på listen 100, kan vi nu se, at 100 faktisk er blevet fjernet!magiske metoder giver mulighed for at ændre standardadfærd. Bedst af alt er det ikke nødvendigt at lære nye metodenavne eller en ny grænseflade, så metoderne kan implementeres intuitivt. En guide til brug af disse magiske metoder implementeret i MyCustomList er angivet i nedenstående tabel.
Example 2: __ Mul _ _ magic method
Vi kan også gøre brug af multiplikationsoperatøren i vores klassedesign. Da vi arver fra den indbyggede listeklasse, kan vi lynlåse to MyCustomList-objekter sammen (fordi de fungerer som listeobjekter) og gentage gennem lynlåsobjektet. Under iterationerne kan vi multiplicere elementerne i hver liste med det tilsvarende element i den anden liste på en udsendelsesmode (se __mul__ magic method code snippet nedenfor). Denne udsendelsesadfærd svarer til den, der findes i dataanalysepakker som Pandas og Numpy.
eksemplet viser, at vi kan flere to MyCustomList-objekter sammen ved hjælp af * – tegnet. Hvis vi fanger den returnerede værdi i en variabel kaldet list_three og print list_three, vises en ny liste. Denne liste er produktet af at multiplicere elementerne mod hinanden fra de andre 2 lister.
hele kildekoden for den klasse, der anvendes i dette eksempel, MyCustomList er vist nedenfor: