magiske metoder i Python, ved eksempel

div >

billede venligst udlånt af www..com

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

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

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.

__mul__ er en metode fra mycustomlist-klassen. Her vises det isoleret.

multiplikationsoperatøren * løser et __Mul__ magic method-opkald, som vi kan tilpasse for at returnere den adfærd, vi ønsker.

hele kildekoden for den klasse, der anvendes i dette eksempel, MyCustomList er vist nedenfor:

Eksempelbonus: __ Call _ _ magic method

for at afslutte vil jeg illustrere, hvordan __call__ magic-metoden i Python kan påberåbes. __call__ kan være særlig nyttig i klasser med tilfælde, der ofte skal ændre deres tilstand. “Opkald” forekomsten kan være en intuitiv og elegant måde at ændre objektets tilstand på.

overvej det viste eksempel. Her har klassen MyClass en init-konstruktør, der forventer tre argumenter bestået. Disse tre argumenter kan overføres i init-metodesignaturen og tildeles som attributter i objektet.call magic-metoden er nyttig, når vi vil ændre en instans tilstand uden faktisk at oprette en ny instans.

når forekomsten først initialiseres, passerer jeg i heltalene 1, 2 og 3, som er tildelt som attributter var_1, var_2 og var_3 i henholdsvis forekomsten. Når jeg bruger udskriftserklæringen til at vise udgangen af forekomsten, obj, ved at bruge attributten __dict__, kan jeg se, at var_1 er tildelt værdien 1, var_2 er tildelt værdien 2, og var_3 er tildelt værdien 3.

lad os nu foreslå, at jeg gerne vil ændre denne instans var_1 og var_2 attributværdier, mens du holder var_3 attributten som den var, da forekomsten oprindeligt blev konstrueret.

at gøre dette er simpelt. Jeg definerer en call magic metode, som tillader var_1 og var_2 attributter at blive omdefineret. Magiske metoder kan kaldes implicit, hvilket betyder, at jeg simpelthen kalder obj(200, 300), og opkaldsmetoden vil blive påberåbt. Det er selvfølgelig også muligt at påberåbe sig opkaldsmetoden eksplicit, f.eks.__ ring__(200, 300), men den første metode virker mere intuitiv. Endelig har jeg til demonstrationsformål trykt instansens id for helt sikkert at vise, at vi har manipuleret det samme objekt.

opkaldsmetoden kan defineres på to måder. Argumenterne kan enten overføres direkte til opkaldsmetodesignaturen. Alternativt kan * Vars-argumentet bruges, som fanger alle argumenter, der er bestået, og gemmer dem i en tupel, som kan pakkes ud som vist ovenfor.

kildekoden til dette eksempel kan findes nedenfor.

oversigt

magiske metoder kan berige vores klassedesign ved at give os adgang til kernesyntaksfunktioner. I de første eksempler har vi det bedste fra begge verdener. Vi kan arve fra den indbyggede listeklasse og ændre bestemte metoder i den klasse for at tilpasse adfærd. getitem, setitem og delitem blev alle ændret, men gennem arv kunne vi stadig gøre brug af listens indbyggede init og repr() metoder for eksempel.

Vi kan kommunikere brugen af objekterne ekstremt let til andre udviklere. I det givne eksempel er alt, hvad vi har brug for at fortælle vores medudviklere, at vores klasse fungerer som en liste, bare lidt anderledes, her kasserer vi ideen om et nulindeks. Der er ingen grund til at lære nye metoder navn eller en ny grænseflade.

derudover blev call magic-metoden demonstreret. At kalde forekomsten kan være en intuitiv og elegant måde at ændre objektets tilstand på.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.