Magic Methods in Python, voorbeeld

Afbeelding met Dank aan www..com

het Veranderen van de Ingebouwde Gedrag met behulp van Magie Methodes

Magic methoden zijn speciale methoden die u kunt definiëren toevoegen ‘magic’ naar uw lessen. Ze zijn altijd omgeven door dubbele underscores, bijvoorbeeld de __init__ en __Str__ magische methoden. Magische methoden kunnen ons klasseontwerp verrijken door ons toegang te geven tot de ingebouwde syntaxisfuncties van Python.

Python laat onze klassen erven van ingebouwde klassen. Een inheriting child class van een ingebouwde deelt alle dezelfde attributen, met inbegrip van methoden als de ingebouwde. We kunnen profiteren van de kern ingebouwde functionaliteit, maar aanpassen geselecteerde bewerkingen door het gebruik van magische methoden.

In deze tutorial zal ik deze twee ideeën aan elkaar koppelen om te laten zien hoe we kunnen erven van de ingebouwde lijst klasse en gebruik kunnen maken van magische methoden in ons klasseontwerp. Ik zal de drie magische methoden die lijst indexering controleren wijzigen. Door beide functies te combineren, kan een klasse die zeer eenvoudig te gebruiken is worden geconstrueerd en kunnen we gedrag toevoegen aan methoden die we wensen. Ingebouwd gedrag is bekend bij alle Python ontwikkelaars; op zijn beurt maakt dit gebruik van onze ervende klasse gemakkelijk te leren.

ten slotte zullen nog twee bredere voorbeelden worden getoond die illustreren hoe magische methoden kunnen worden gebruikt in broadcast operaties en het veranderen van de status van een instantie. Alle begeleidende code is beschikbaar via GitHub.

Voorbeeld 1: Lijst indexering

magische methoden kunnen worden gemanipuleerd om lijst indexering te wijzigen. De klasse MyCustomList, erft van het ingebouwde lijsttype. Dit betekent dat elk object dat is gemaakt via de mycoustomlist Klasse zich zal gedragen als een lijst, behalve op de plaatsen waar we ervoor kiezen om selectief methoden aan te passen.

getitem, setitem en delitem zijn magische methoden die worden aangeroepen wanneer we toegang krijgen tot de lijstindex. Het gedrag van deze magische methoden kan worden gewijzigd.

in het voorbeeld hieronder, verwerpen we het idee van lijstindexering te beginnen bij de nulde index. Als de gebruiker probeert toegang te krijgen tot een element uit onze lijst met behulp van de nulth index, zal een ValueError uitzondering worden verhoogd en het programma zal worden beëindigd. Als de gebruiker een lijstindex van meer dan één invoert, worden de methoden de index met één verminderd en wordt de bovenliggende klassenlijst met de index aangeroepen.

om te laten zien hoe deze methoden gedefinieerd in de klasse MyCustomList worden gebruikt, zie hieronder in de Python interactieve prompt.

Het voorbeeld laat zien hoe getitem, setitem en delitem kan worden genoemd. Magische methoden kunnen impliciet worden genoemd. Voor __getitem__, om toegang te krijgen tot de eerste index, schrijf de naam van het object gevolgd door de index positie tussen vierkante haken.

wat het meest interessant is, is dat wanneer we vragen om het element op indexpositie 1, de gehele waarde 1 wordt geretourneerd, ook al is 1 het Nulde element. Wat we hier hebben is een lijst die begint met het indexeren vanaf 1. In feite maakt het de verwarring goed die we allemaal hadden toen we voor het eerst lijstindexering leerden kennen.

laten we nu de gehele waarde 1 in de lijst veranderen naar 100. Om dit te doen, moeten we een beroep doen op setitem. Om dit te doen, schrijven we gewoon de naam van het object, gevolgd door vierkante haken en een toewijzing. Nogmaals, om het eerste element in de lijst te veranderen gebruiken we index positie 1. Wanneer we de lijst opnieuw uitvoeren, kunnen we duidelijk zien dat het eerste element is veranderd van 1 naar 100.

ten slotte kan een element uit de lijst __delitem__ worden verwijderd. De__ delitem _ _ magische methode wordt aangeroepen, wanneer we het Del python sleutelwoord gebruiken dat oplost naar de__ delitem _ _ methode aanroep. Om verder te bouwen op onze lijst indexeren voorbeeld, laten we verwijderen van het eerste element in de index, de integer waarde 100. Als we del noemen, gevolgd door het object en de indexpositie van het element dat we willen verwijderen, in dit voorbeeld, het eerste element in de lijst 100, kunnen we nu zien dat 100 in feite is verwijderd!

magische methoden bieden de kans om standaard gedrag te wijzigen. Het beste van alles, er is geen noodzaak om nieuwe methodenamen of een nieuwe interface te leren, zodat de methoden intuïtief kunnen worden geïmplementeerd. Een gids voor het gebruik van deze magische methoden geà mplementeerd in MyCustomList is gespecificeerd in de tabel hieronder.

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

Example 2: De__ mul _ _ magic method

we kunnen ook gebruik maken van de vermenigvuldigingsoperator in ons klasseontwerp. Omdat we erven van de ingebouwde lijst klasse, kunnen we twee MyCustomList objecten samen zip (omdat ze fungeren als lijst objecten) en itereren door het zip-object. Tijdens de iteraties kunnen we de elementen in elke lijst vermenigvuldigen met het overeenkomstige element in de andere lijst op een broadcast manier (zie __mul__ magic method code fragment hieronder). Dit broadcast gedrag is vergelijkbaar met dat gevonden in data analyse pakketten zoals Panda ‘ s en Numpy.

het voorbeeld laat zien dat we meerdere twee MyCustomList objecten samen kunnen gebruiken met het * teken. Als we de geretourneerde waarde vastleggen in een variabele genaamd list_three en list_three afdrukken, wordt een nieuwe lijst uitgevoerd. Deze lijst is het product van het vermenigvuldigen van de elementen tegen elkaar uit de andere 2 lijsten.

__mul__ is een methode uit de mycustomlist klasse. Hier wordt het afgebeeld in afzondering.

De operator voor vermenigvuldigen * verhelpt een __mul__ magische aanroep van de methode, die wij kunnen aanpassen om terug te keren van het gedrag dat we verlangen.

de volledige broncode voor de klasse die in dit voorbeeld wordt gebruikt, MyCustomList wordt hieronder getoond:

Voorbeeldbonus: De__ call _ _ magic method

om te eindigen zal ik illustreren hoe de __call__ magic method in Python kan worden aangeroepen. __call__ kan vooral nuttig zijn in klassen met instanties die vaak hun status moeten veranderen. “Calling” de instantie kan een intuïtieve en elegante manier om de toestand van het object te veranderen.

beschouw het getoonde voorbeeld. Hier, de klasse MyClass heeft een init constructor die verwacht dat drie argumenten doorgegeven. Deze drie argumenten kunnen worden doorgegeven in de init methode handtekening en toegewezen als attributen in het object.

De aanroepmagie methode is handig als we de status van een instantie willen wijzigen, zonder daadwerkelijk een nieuwe instantie aan te maken.

wanneer de instantie voor het eerst wordt geïnitialiseerd, geef ik de gehele getallen 1, 2 en 3 door, die respectievelijk zijn toegewezen als attributen var_1, var_2 en var_3 in de instantie. Wanneer ik het print statement gebruik om de uitvoer van de instantie, obj, te tonen met behulp van het__ dict _ _ attribuut, kan ik zien dat var_1 de waarde 1 krijgt toegewezen, var_2 de waarde 2 en var_3 de waarde 3.

laten we nu voorstellen dat ik de var_1 en var_2 attribuutwaarden van deze instantie wil wijzigen, terwijl het var_3 attribuut behouden blijft zoals het was toen de instantie oorspronkelijk gebouwd werd.

om dit te doen is eenvoudig. Ik definieer een call magic methode, die het mogelijk maakt de var_1 en var_2 attributen opnieuw te definiëren. Magische methoden kunnen impliciet worden genoemd, wat betekent dat ik gewoon obj(200, 300) aanroep, en de aanroepmethode zal worden aangeroepen. Uiteraard is het ook mogelijk om de aanroepmethode expliciet aan te roepen, bijvoorbeeld obj.__ call__(200, 300), maar de eerste methode lijkt meer intuïtief. Tot slot, voor demonstratie doeleinden, heb ik de instantie ‘ s id afgedrukt om zeker te laten zien, dat we hetzelfde object hebben gemanipuleerd.

de aanroepmethode kan op twee manieren worden gedefinieerd. De argumenten kunnen ofwel direct worden doorgegeven aan de aanroepmethode handtekening. Als alternatief kan het * vars argument gebruikt worden, dat alle doorgegeven argumenten opneemt en ze opslaat in een tupel, die kan worden uitgepakt zoals hierboven getoond.

De broncode voor dit voorbeeld is hieronder te vinden.

samenvatting

magische methoden kunnen ons klasseontwerp verrijken door ons toegang te geven tot kernsyntaxefuncties. In de eerste voorbeelden hebben we het beste van beide werelden. We kunnen erven van de ingebouwde lijstklasse en bepaalde methoden in die klasse wijzigen om gedrag aan te passen. getitem, setitem, en delitem werden allemaal gewijzigd, maar door overerving, waren we nog steeds in staat om gebruik te maken van de lijst ingebouwde init en repr() methoden bijvoorbeeld.

we kunnen het gebruik van de objecten zeer gemakkelijk communiceren met andere ontwikkelaars. In het gegeven voorbeeld, alles wat we nodig hebben om onze collega-ontwikkelaars te vertellen is dat onze klasse werkt als een lijst, net een beetje anders, hier verwerpen we het idee van een Nulde index. Er is geen noodzaak om nieuwe methoden naam of een nieuwe interface te leren.

daarnaast werd de aanroepmagie methode gedemonstreerd. Het aanroepen van de instantie kan een intuïtieve en elegante manier om de toestand van het object te veranderen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.