Magické Metody v Pythonu, příkladem

Obrázek se Svolením www..com

Změna Vestavěný Chování pomocí Magické Metody

Kouzelná metody jsou speciální metody, které lze definovat přidat „magie“ do svých tříd. Jsou vždy obklopeny dvojitými podtržítky, například magickými metodami __init__ a __str__. Magické metody mohou obohatit náš návrh třídy tím, že nám umožní přístup k vestavěným funkcím syntaxe Pythonu.

Python umožňuje našim třídám dědit z vestavěných tříd. Zděděná podřízená třída vestavěného sdílí všechny stejné atributy, včetně metod jako vestavěný. Můžeme využít základní vestavěné funkce, ale přizpůsobit vybrané operace pomocí magických metod.

V tomto tutoriálu, budu svázat tyto dvě myšlenky dohromady, aby předvedli, jak můžeme zdědit z vestavěného seznamu třídy a využít magické metody v naší třídě designu. Upravím tři magické metody, které řídí indexování seznamu. Kombinací obou těchto funkcí lze vytvořit třídu, která je velmi jednoduchá a můžeme přidat chování k metodám, které si přejeme. Vestavěné chování je známé všem vývojářům Pythonu; na druhé straně, díky tomu je snadné se naučit naši zděděnou třídu.

nakonec budou demonstrovány další dva širší příklady, které ilustrují, jak lze magické metody použít ve vysílání a změnit stav instance. Veškerý doprovodný kód je k dispozici prostřednictvím Githubu.

Příklad 1: Indexování seznamu

pomocí magických metod lze manipulovat s úpravou indexování seznamu. Třída MyCustomList, dědí z vestavěného typu seznamu. To znamená, že jakýkoli objekt, který je vytvořen prostřednictvím třídy MyCustomList, se bude chovat jako seznam, s výjimkou míst, kde se rozhodneme selektivně přizpůsobit metody.

getitem, setitem a delitem jsou magické metody, které se vyvolávají při přístupu k indexu seznamu. Chování těchto magických metod lze upravit.

v níže uvedeném příkladu odmítáme myšlenku indexování seznamu začínajícího na nultém indexu. Pokud se uživatel pokusí získat přístup k prvku z našeho seznamu pomocí nultého indexu, bude zvýšena výjimka ValueError a program bude ukončen. Pokud uživatel zadá index seznamu větší než jeden, metody sníží index o jeden a poté vyvolá seznam nadřazených tříd s indexem.

Chcete-li ukázat, jak jsou tyto metody definované ve třídě MyCustomList používány, viz níže v interaktivní výzvě Pythonu.

tento příklad ukazuje, jak getitem, setitem a delitem může být nazýván. Magické metody lze nazvat implicitně. Pro _ _ getitem__, pro přístup k prvnímu indexu, jednoduše napište název objektu následovaný pozicí indexu do hranatých závorek.

nejzajímavější je, že když požádáme o prvek na pozici indexu 1, vrátí se celočíselná hodnota 1, i když 1 je nulový prvek. To, co zde máme, je seznam, který začíná indexováním počínaje 1. Ve skutečnosti je to dohnat zmatek, který jsme všichni měli, když jsme se poprvé naučili indexování seznamu.

nyní změníme celočíselnou hodnotu 1 v seznamu na 100. K tomu musíme vyvolat setitem. Chcete-li to provést, jednoduše napište název objektu, následovaný hranatými závorkami a přiřazením. Opět platí, že pro změnu prvního prvku v seznamu použijeme pozici indexu 1. Když znovu vydáme seznam, můžeme jasně vidět, že první prvek se změnil z 1 na 100.

nakonec lze definovat odstranění prvku ze seznamu __delitem__. Metoda__ delitem _ _ magic je vyvolána, když použijeme Klíčové slovo del python, které řeší volání metody __delitem__. Chcete-li dále stavět na našem příkladu indexování seznamu, umožňuje odstranit první prvek v indexu, celočíselnou hodnotu 100. Když zavoláme del, následovaný objektem a indexovou pozicí prvku, který chceme odstranit, v tomto příkladu první prvek v seznamu 100, nyní můžeme vidět, že 100 bylo ve skutečnosti odstraněno!

magické metody nabízejí možnost změnit výchozí chování. Nejlepší ze všeho je, že není třeba se učit nové názvy metod nebo nové rozhraní, takže metody lze intuitivně implementovat. Návod k použití těchto magických metod implementovaných v Mycustomlistu je uveden v následující tabulce.

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

Example 2: Magickou metodu__ mul _ _

můžeme také využít operátoru násobení v našem návrhu třídy. Protože zdědíme z vestavěné třídy seznamu, můžeme zipovat dva objekty Mycustomlistu dohromady (protože fungují jako objekty seznamu) a iterovat objektem zip. Během iterací můžeme vynásobit prvky v každém seznamu odpovídajícím prvkem v jiném seznamu způsobem vysílání (viz __mul__ fragment kódu magické metody níže). Toto chování vysílání je podobné chování nalezené v balíčcích pro analýzu dat, jako jsou pandy a Numpy.

příklad ukazuje, že pomocí znaku * můžeme více dvou objektů Mycustomlistu dohromady. Pokud zachytíme vrácenou hodnotu v proměnné nazvané list_three a vytiskneme list_three, vypíše se nový seznam. Tento seznam je výsledkem násobení prvků proti sobě z ostatních 2 seznamů.

__mul__ je metoda z MyCustomList třídy. Zde se zobrazuje izolovaně.

operátor násobení * řeší __mul__ magie volání metody, které můžeme přizpůsobit k návratu chování toužíme.

celý zdrojový kód třídy používané v tomto příkladu, MyCustomList je uvedeno níže:

Příklad Bonus: Metoda__ call _ _ magic

Na závěr ilustruji, jak lze vyvolat metodu__ call _ _ magic v Pythonu. __call__ může být obzvláště užitečné ve třídách s instancemi, které potřebují často měnit svůj stav. „Volání“ instance může být intuitivní a elegantní způsob, jak změnit stav objektu.

zvažte ukázaný příklad. Zde má Třída MyClass Konstruktor init, který očekává tři předané argumenty. Tyto tři argumenty mohou být předány v podpisu metody init a přiřazeny jako atributy v objektu.

metoda volání magie je užitečná, když chceme změnit stav instance, aniž bychom skutečně vytvořili novou instanci.

při první inicializaci instance předám celá čísla 1, 2 a 3, která jsou v instanci přiřazena jako atributy var_1, var_2 a var_3. Když jsem se použít příkaz print ukázat výstup z instance, obj, pomocí __dict__ attribute, vidím, že var_1 je přiřazena hodnota 1, var_2 je přiřazena hodnota 2, a var_3 je přiřazena hodnota 3.

Nyní, pojďme navrhnout, že bych rád, aby se změna tomto případě je var_1 a var_2 hodnoty atributu, přičemž var_3 atribut jak to bylo, když instance byla původně postavena.

to je jednoduché. Definuji metodu volání magie, která umožňuje předefinování atributů var_1 a var_2. Magické metody lze volat implicitně, což znamená, že jednoduše volám obj (200, 300) a vyvolá se metoda volání. Samozřejmě je také možné vyvolat metodu volání explicitně, např. obj.__ call__(200, 300), ale první metoda se zdá být intuitivnější. Konečně, pro demonstrační účely, vytiskl jsem id instance, abych definitivně ukázal, že jsme manipulovali se stejným objektem.

volání metody mohou být definovány dvěma způsoby. Argumenty mohou být buď předány přímo do podpisu metody volání. Alternativně lze použít argument * vars, který zachycuje všechny předané argumenty a ukládá je do n-tice, kterou lze rozbalit, jak je uvedeno výše.

zdrojový kód pro tento příklad lze nalézt níže.

Shrnutí

Kouzelná metody mohou obohatit naše třída design tím, že nám přístup k základní syntaxe funkcí. V prvních příkladech máme to nejlepší z obou světů. Můžeme zdědit z vestavěné třídy seznamu, a upravit konkrétní metody v této třídě přizpůsobit chování. getitem, setitem a delitem byly všechny upraveny, ale díky dědičnosti jsme byli stále schopni využít například vestavěné metody init a repr () seznamu.

můžeme velmi snadno sdělit použití objektů ostatním vývojářům. V uvedeném příkladu musíme našim kolegům vývojářům říci, že naše třída se chová jako seznam, jen trochu jinak, zde zahodíme myšlenku nultého indexu. Není třeba se učit nové metody název nebo nové rozhraní.

kromě toho byla demonstrována metoda volání magie. Volání instance může být intuitivní a elegantní způsob, jak změnit stav objektu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.