Mágikus Módszerek Python, a példa

Kép Jóvoltából www..com

a Változó Beépített Viselkedés Mágiával Módszerek

Mágikus módszerek különleges módszerek, hogy megadhatjuk, hogy adjunk ‘mágikus’ az osztályba. Mindig kettős aláhúzás veszi körül őket, például a __init__ és __str__ mágikus módszerek. A mágikus módszerek gazdagíthatják osztálytervünket azáltal, hogy hozzáférést biztosítanak a Python beépített szintaxis funkcióihoz.

a Python lehetővé teszi, hogy osztályaink a beépített osztályoktól örököljenek. A beépített öröklődő gyermekosztály ugyanazokat az attribútumokat osztja meg, beleértve a beépített módszereket is. Kihasználhatjuk az alapvető beépített funkciókat, de testreszabhatjuk a kiválasztott műveleteket mágikus módszerek használatával.

ebben az oktatóanyagban összekapcsolom ezt a két ötletet, hogy bemutassam, hogyan örökölhetünk a beépített list osztályból, és használhatunk mágikus módszereket az osztálytervünkben. Módosítom a három mágikus módszert, amelyek szabályozzák a lista indexelését. Mindkét tulajdonság kombinálásával egy nagyon egyszerűen használható Osztály felépíthető, és viselkedést adhatunk hozzá a kívánt módszerekhez. A beépített viselkedés minden Python-fejlesztő számára ismerős; ez viszont könnyen megtanulható örökölt osztályunkat használja.

végül két további tágabb példát mutatunk be, amelyek bemutatják, hogyan lehet mágikus módszereket használni a sugárzási műveletekben és megváltoztatni egy példány állapotát. Minden kísérő kód elérhető a GitHub – on keresztül.

1. példa: Lista indexelés

a mágikus módszerek manipulálhatók a lista indexelésének módosításához. Az osztály MyCustomList, örökli a beépített lista típusát. Ez azt jelenti, hogy a MyCustomList osztályon keresztül létrehozott bármely objektum listaként fog viselkedni, kivéve azokat a helyeket, ahol a módszerek szelektív testreszabását választjuk.

a getitem, a setitem és a delitem mágikus módszerek, amelyeket a lista indexének elérésekor hívunk meg. Ezeknek a mágikus módszereknek a viselkedése módosítható.

az alábbi példában elvetjük a nulladik indextől kezdődő listaindexelés gondolatát. Ha a felhasználó a nulladik index segítségével próbál hozzáférni egy elemhez a listánkból, akkor egy ValueError kivétel jelenik meg, és a program megszűnik. Ha a felhasználó egynél nagyobb listaindexet ad meg, a módszerek eggyel csökkentik az indexet, majd az Indexszel felhívják a szülőosztály-listát.

a MyCustomList osztályban meghatározott módszerek használatának bemutatásához lásd alább a Python interaktív promptban.

a példa bemutatja, hogyan hívhatók meg a getitem, a setitem és a delitem. A mágikus módszereket implicit módon lehet nevezni. A __getitem_ _ esetében az első index eléréséhez egyszerűen írja be az objektum nevét, majd az index pozícióját szögletes zárójelben.

a legérdekesebb az, hogy amikor az elemet az 1.indexpozícióban kérjük, az 1 egész értéket adjuk vissza, annak ellenére, hogy 1 a nulladik elem. Mi van itt egy lista, amely kezdődik ez indexelés kezdve 1. Valójában, ez teszi ki a zavart, hogy mi minden volt, amikor először megtanult lista indexelés.

most változtassuk meg a lista 1-es egész értékét 100-ra. Ehhez meg kell hívnunk a setitemet. Ehhez egyszerűen írjuk az objektum nevét, majd szögletes zárójelekkel és egy hozzárendeléssel. Ismét a lista első elemének megváltoztatásához az 1. indexpozíciót használjuk. Amikor újra kiadjuk a listát, egyértelműen láthatjuk, hogy az első elem 1-ről 100-ra változott.

végül egy elem törléséhez a listából __delitem__ definiálható. A__ delitem _ _ magic metódus akkor kerül meghívásra, amikor a del python kulcsszót használjuk, amely feloldódik a __delitem__ metódushívásra. A lista indexelési példánk további felépítéséhez töröljük az index első elemét, a 100 egész értéket. Amikor del-t hívunk, majd a törölni kívánt elem objektumát és indexpozícióját, ebben a példában a 100 lista első elemét, most láthatjuk, hogy a 100 valójában eltávolításra került!

a mágikus módszerek lehetőséget kínálnak az alapértelmezett viselkedés módosítására. A legjobb az egészben, hogy nincs szükség új módszernevek vagy új felület megtanulására, így a módszerek intuitív módon megvalósíthatók. A mycustomlist-ban megvalósított mágikus módszerek használatának útmutatóját az alábbi táblázat tartalmazza.

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

Example 2: A__ Mul _ _ mágikus módszer

a szorzási operátort is felhasználhatjuk osztálytervünkben. Mivel a beépített list osztályból örökölünk, két MyCustomList objektumot együtt zipelhetünk (mert úgy viselkednek, mint a list objektumok), és a zip objektumon keresztül iterálhatunk. Az iterációk során az egyes listák elemeit megsokszorozhatjuk a másik lista megfelelő elemével sugárzott módon (lásd: __Mul__ magic method kódrészlet alább). Ez a sugárzási viselkedés hasonló az adatelemző csomagokban, mint például a Pandas és a Numpy.

a példa azt mutatja, hogy a * jel segítségével két MyCustomList objektumot is össze tudunk állítani. Ha a visszaadott értéket egy list_three nevű változóban rögzítjük, és list_three nyomtatása esetén egy új lista jelenik meg. Ez a lista az elemek szorzatának szorzata a másik 2 listából.

> >

> >

__a Mul__ a mycustomlist osztály egyik módszere. Itt elszigetelten jelenik meg.

a szorzás operátor * feloldja a __Mul__ mágikus módszer hívás, amelyet testre szabhatunk, hogy visszatérjen a kívánt viselkedést.

Az ebben a példában használt osztály teljes forráskódja, a MyCustomList az alábbiakban látható:

példa bónusz: A__ call _ _ magic metódus

a befejezéshez bemutatom, hogyan lehet A__ call _ _ magic metódust Pythonban meghívni. __call__ különösen hasznos lehet olyan osztályokban, ahol az állapotukat gyakran meg kell változtatni. A példány “hívása” intuitív és elegáns módja lehet az objektum állapotának megváltoztatására.

Tekintsük a bemutatott példát. Itt a MyClass osztálynak van egy init konstruktora,amely három argumentumot vár el. Ez a három argumentum átadható az init metódus aláírásában, és attribútumként rendelhető hozzá az objektumhoz.

a call magic módszer akkor hasznos, ha meg akarjuk változtatni egy példány állapotát, anélkül, hogy ténylegesen létrehoznánk egy új példányt.

a példány első inicializálásakor az 1-es, 2-es és 3-as egész számokban lépek át, amelyek a példányon var_1, var_2 és var_3 attribútumként vannak hozzárendelve. Amikor a print utasítást használom az obj példány kimenetének megjelenítéséhez a _ _ dict _ _ attribútum használatával, látom, hogy a var_1 az 1 értéket, a var_2 a 2 értéket, a var_3 pedig a 3 értéket kapja.

most tegyük fel, hogy szeretném megváltoztatni ennek a példánynak a var_1 és var_2 attribútumértékeit, miközben megtartom a var_3 attribútumot, mint a példány eredeti felépítésekor.

Ez egyszerű. Megadok egy call magic metódust, ami lehetővé teszi a var_1 és var_2 attribútumok újradefiniálását. A mágikus módszerek implicit módon hívhatók, ami azt jelenti, hogy egyszerűen hívom az obj-t(200, 300), és a hívás metódusa meghívásra kerül. Természetesen lehetőség van a hívás metódusának explicit meghívására is, pl. obj.__hívás _ _ (200, 300), de az első módszer intuitívabbnak tűnik. Végül demonstrációs célokra kinyomtattam a példány Azonosítóját, hogy határozottan megmutassam, hogy ugyanazt az objektumot manipuláltuk.

a hívási módszer kétféleképpen definiálható. Az argumentumok vagy közvetlenül átadhatók a hívási módszer aláírásába. Alternatív megoldásként a * vars argumentum is használható, amely rögzíti az összes átadott argumentumot, és tárolja azokat egy tuple-ben, amely kicsomagolható a fent látható módon.

a példa forráskódja alább található.

Összegzés

a mágikus módszerek gazdagíthatják osztálytervünket azáltal, hogy hozzáférést biztosítanak az alapvető szintaxis funkciókhoz. Az első példákban mindkét világ legjobbja van. Örökölhetünk a beépített listaosztályból, és módosíthatjuk az adott osztály bizonyos módszereit a viselkedés testreszabása érdekében. a getitem, a setitem és a delitem mind módosult, de az öröklődés révén továbbra is használhattuk például a lista beépített init és repr() módszereit.

az objektumok használatát rendkívül könnyen kommunikálhatjuk a többi fejlesztővel. A megadott példában csak annyit kell mondanunk fejlesztőtársainknak, hogy osztályunk úgy viselkedik, mint egy lista, csak egy kicsit másképp, itt elvetjük a nulladik index gondolatát. Nincs szükség, hogy megtanulják az új módszerek nevét, vagy egy új felület.

ezenkívül bemutatták a hívásvarázs módszerét. A példány meghívása intuitív és elegáns módja lehet az objektum állapotának megváltoztatására.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.