sisäänrakennetun käyttäytymisen muuttaminen Taikamenetelmillä
Taikamenetelmät ovat erityisiä menetelmiä, jotka voit määritellä lisätäksesi ”magian” luokillesi. Niitä ympäröi aina kaksinkertainen alaviiva, esimerkiksi __ init_ _ja __ str_ _ taikamenetelmät. Taikamenetelmät voivat rikastuttaa luokkasuunnitteluamme antamalla meille pääsyn Pythonin sisäänrakennettuihin syntaksiominaisuuksiin.
Python antaa luokkien periä sisäänrakennetuista luokista. Sisäänrakennetun lapsen perivällä lapsiluokalla on kaikki samat ominaisuudet, myös menetelmät kuin sisäänrakennetulla. Voimme hyödyntää ytimen sisäänrakennettua toiminnallisuutta, mutta muokata valikoituja toimintoja taikamenetelmien avulla.
tässä opetusohjelmassa Sidon nämä kaksi ideaa yhteen esittelemään, miten voimme periä sisäänrakennetulta listaluokalta ja hyödyntää taikamenetelmiä luokkamme suunnittelussa. Muutan kolmea taikamenetelmää, jotka ohjaavat listojen indeksointia. Yhdistämällä molemmat ominaisuudet, luokka, joka on hyvin yksinkertainen käyttää voidaan rakentaa ja voimme lisätä käyttäytymistä menetelmiä haluamme. Sisäänrakennettu käyttäytyminen on tuttua kaikille Python-kehittäjille; tämä puolestaan tekee perittävän luokan käytöstä helppoa oppia.
lopuksi esitellään vielä kaksi laajempaa esimerkkiä, jotka kuvaavat, miten taikamenetelmiä voidaan käyttää broadcast-operaatioissa ja miten instanssin tila muuttuu. Kaikki oheinen koodi on saatavilla Githubin kautta.
Esimerkki 1: Listojen indeksointia
Taikamenetelmiä voidaan manipuloida muokkaamaan listojen indeksointia. Luokan MyCustomList, perii sisäänrakennettu luettelo tyyppi. Tämä tarkoittaa, että mikä tahansa olio, joka on luotu MyCustomList-luokan kautta, käyttäytyy kuin lista, paitsi paikoissa, joissa valitsemme valikoivasti muokata menetelmiä.
getitem, setitem ja delitem ovat taikamenetelmiä, joihin vedotaan, kun päästään käsiksi listahakemistoon. Näiden taikamenetelmien käyttäytymistä voidaan muokata.
alla olevassa esimerkissä hylkäämme ajatuksen listan indeksoinnista, joka alkaa zeroth-indeksistä. Jos käyttäjä yrittää käyttää elementtiä listaltamme käyttäen zeroth-indeksiä, ValueError-poikkeus nostetaan ja ohjelma päättyy. Jos käyttäjä syöttää listaindeksin, joka on suurempi kuin yksi, menetelmät pienentävät indeksiä yhdellä ja kutsuvat sitten yläluokkaluettelon indeksillä.
voit esitellä, miten näitä mycustomlist-luokassa määriteltyjä menetelmiä käytetään, katso alla Python interactive-kehote.
esimerkki osoittaa, miten getitemiä, setitemiä ja delitemiä voidaan kutsua. Taikamenetelmiä voidaan kutsua epäsuorasti. Jos haluat käyttää __getitem__, Kirjoita hakasulkeisiin kohteen nimi ja indeksin sijainti.
kiinnostavinta on se, että kun kysymme alkiota indeksipisteessä 1, kokonaislukuarvo 1 palautuu, vaikka 1 on nollaelementti. Mitä meillä on tässä on luettelo, joka alkaa se indeksointi alkaa 1. Itse asiassa se hyvittää sekaannusta, joka meillä kaikilla on ollut, kun opettelimme luetteloiden indeksointia.
nyt muutetaan listan kokonaislukuarvo 1: ksi 100: ksi. Tätä varten meidän on vedottava setitemiin. Voit tehdä tämän, me yksinkertaisesti kirjoittaa kohteen nimi, jonka jälkeen hakasulkeet ja toimeksianto. Jälleen muuttaa ensimmäinen elementti luettelossa käytämme indeksin asema 1. Kun julkaisemme luettelon uudelleen, voimme selvästi nähdä, että ensimmäinen elementti on muuttunut 1: stä 100: aan.
lopuksi voidaan määritellä elementin poistaminen luettelosta __delitem__. __ Deitem_ _ taikamenetelmä otetaan käyttöön, kun käytämme del python-avainsanaa, joka ratkaisee __ deitem_ _ – menetelmäkutsun. Voit edelleen rakentaa meidän luettelo indeksointi esimerkki, lets delete the first element in the index, the integer value 100. Kun kutsumme del, jonka jälkeen objektin ja indeksin asema elementin haluamme poistaa, tässä esimerkissä, ensimmäinen elementti luettelossa 100, voimme nyt nähdä, että 100 on itse asiassa poistettu!
Taikamenetelmät tarjoavat mahdollisuuden muokata oletuskäyttäytymistä. Mikä parasta, uusien menetelmien nimiä tai uutta käyttöliittymää ei tarvitse opetella, joten menetelmät voidaan toteuttaa intuitiivisesti. Opas näiden mycustomlistissa toteutettujen taikamenetelmien käyttöön on esitetty alla olevassa taulukossa.
Example 2: __ Mul _ _ taikamenetelmä
voimme myös hyödyntää kertolaskuoperaattoria luokkasuunnittelussamme. Koska perimme sisäänrakennetusta luetteloluokasta, voimme zip kaksi MyCustomList-objektia yhdessä (koska ne toimivat luetteloobjektien tavoin) ja iteroida zip-objektin kautta. Iteraatioiden aikana voimme kertoa kunkin luettelon elementit sen vastaavalla elementillä toisessa luettelossa lähetysmuotoon (katso __mul_ _ magic method code pätkä alla). Tämä lähetyskäyttäytyminen on samanlaista kuin data-analyysipaketeissa, kuten Pandoissa ja Numpyissa.
esimerkki osoittaa, että voimme moninkertaistaa kaksi MyCustomList-kohdetta yhdessä * – merkin avulla. Jos nappaamme palautetun arvon muuttujassa list_three ja tulostamme list_three, uusi lista on lähtö. Tämä luettelo saadaan kertomalla alkuaineet toisiaan vastaan muista 2-luetteloista.
tässä esimerkissä käytetyn luokan koko lähdekoodi, MyCustomList näkyy alla:
Esimerkkibonus: __ Call __magic method
loppuun, havainnollistan, Miten__ call _ _ magic method Pythonissa voidaan käyttää. __call__
voi olla erityisen hyödyllinen luokissa, joiden esiintymät joutuvat usein muuttamaan tilaansa. Instanssin ”kutsuminen” voi olla intuitiivinen ja tyylikäs tapa muuttaa olion tilaa.
tarkastellaan esitettyä esimerkkiä. Tässä luokan MyClass on init rakentaja, joka odottaa kolme argumenttia hyväksytty. Nämä kolme argumenttia voidaan siirtää init-menetelmän allekirjoituksessa ja määrittää objektin attribuuteiksi.
kutsumagia-menetelmä on hyödyllinen, kun haluamme muuttaa instanssin tilaa, luomatta varsinaisesti uutta instanssia.
kun instanssi alustetaan ensimmäisen kerran, ohitan kokonaisluvut 1, 2 ja 3, jotka merkitään attribuuteiksi var_1, var_2 ja var_3. Kun käytän tulostuslausetta näyttääkseni instanssin, obj, tulosteen käyttämällä __dict__ attribuuttia, näen, että var_1: lle annetaan arvo 1, var_2: lle arvo 2 ja var_3: lle arvo 3.
nyt ehdottakaamme, että haluaisin muuttaa tämän instanssin var_1-ja var_2-attribuuttiarvoja, pitäen samalla var_3-attribuutin sellaisena kuin se oli, kun instanssi alun perin konstruoitiin.
tämän tekeminen on yksinkertaista. Määrittelen kutsumagiamenetelmän, jonka avulla var_1-ja var_2-attribuutit voidaan määritellä uudelleen. Magic menetelmiä voidaan kutsua implisiittisesti, mikä tarkoittaa yksinkertaisesti soittaa obj (200, 300), ja puhelun menetelmä vedotaan. Tietenkin on myös mahdollista vedota kutsumenetelmään yksiselitteisesti, esim. obj.__soita_ _ (200, 300), mutta ensimmäinen menetelmä tuntuu intuitiivisemmalta. Lopuksi, demonstrointitarkoituksessa, olen tulostanut instanssin id varmasti osoittaa, että olemme manipuloineet samaa objektia.
kutsumenetelmä voidaan määritellä kahdella tavalla. Argumentit voidaan joko siirtää suoraan puhelumenetelmän allekirjoitukseen. Vaihtoehtoisesti voidaan käyttää *vars-argumenttia, joka kaappaa kaikki hyväksytyt argumentit ja tallentaa ne tupleen, joka voidaan purkaa yllä esitetyllä tavalla.
tämän esimerkin lähdekoodi löytyy alta.
Yhteenveto
Taikamenetelmät voivat rikastuttaa luokkasuunnitteluamme antamalla meille pääsyn ydinsyntaksiominaisuuksiin. Ensimmäisissä esimerkeissä meillä on molempien maailmojen parhaat puolet. Voimme periä sisäänrakennetusta luettelosta luokan, ja muokata tiettyjä menetelmiä, että Luokka muokata käyttäytymistä. getitem, setitem ja delitem olivat kaikki muunneltuja, mutta periytymisen kautta pystyimme silti hyödyntämään esimerkiksi listan sisäänrakennettuja init-ja repr () – menetelmiä.
voimme viestiä objektien käytöstä erittäin helposti muille kehittäjille. Esimerkissä, kaikki mitä meidän tarvitsee kertoa muille kehittäjille on, että meidän luokka toimii kuin luettelo, vain hieman eri tavalla, tässä hylkäämme ajatus zeroth indeksi. Ei ole tarvetta oppia uusia menetelmiä nimi tai uusi käyttöliittymä.
lisäksi osoitettiin call magic-menetelmä. Instanssin kutsuminen voi olla intuitiivinen ja tyylikäs tapa muuttaa olion tilaa.