Metodi Magici in Python, esempio

Immagine per gentile Concessione di www..com

Modifica di Comportamento Integrato utilizzando Metodi Magici

la Magia metodi sono metodi che è possibile definire per aggiungere la ‘magia’ della classe. Sono sempre circondati da doppi caratteri di sottolineatura, ad esempio i metodi __init__ e __str__ magic. I metodi magici possono arricchire il nostro design di classe dandoci accesso alle funzionalità di sintassi integrate di Python.

Python lascia che le nostre classi ereditino dalle classi incorporate. Una classe figlio ereditante di un built-in condivide tutti gli stessi attributi, inclusi i metodi del built-in. Possiamo sfruttare le funzionalità integrate di base, ma personalizzare le operazioni selezionate attraverso l’uso di metodi magici.

In questo tutorial, legherò queste due idee insieme per mostrare come possiamo ereditare dalla classe lista incorporata e fare uso di metodi magici nel nostro design di classe. Modificherò i tre metodi magici che controllano l’indicizzazione dell’elenco. Combinando entrambe queste caratteristiche, una classe che è molto semplice da usare può essere costruita e possiamo aggiungere un comportamento ai metodi che desideriamo. Il comportamento integrato è familiare a tutti gli sviluppatori Python; a sua volta, questo fa uso della nostra classe ereditante facile da imparare.

Infine, verranno dimostrati altri due esempi più ampi che illustrano come i metodi magici possono essere utilizzati nelle operazioni di broadcast e la modifica dello stato di un’istanza. Tutto il codice di accompagnamento è disponibile tramite GitHub.

Esempio 1: Indicizzazione elenco

I metodi magici possono essere manipolati per modificare l’indicizzazione elenco. La classe MyCustomList, eredita dal tipo di elenco incorporato. Ciò significa che qualsiasi oggetto creato tramite la classe MyCustomList si comporterà come un elenco, tranne nei luoghi in cui scegliamo di personalizzare selettivamente i metodi.

getitem, setitem e delitem sono metodi magici che vengono invocati quando accediamo all’indice della lista. Il comportamento di questi metodi magici può essere modificato.

Nell’esempio visualizzato di seguito, stiamo scartando l’idea di indicizzare la lista a partire dall’indice zeroth. Se l’utente tenta di accedere a un elemento dalla nostra lista utilizzando l’indice zeroth, verrà sollevata un’eccezione ValueError e il programma terminerà. Se l’utente inserisce un indice di elenco maggiore di uno, i metodi ridurranno l’indice di uno e quindi chiameranno l’elenco di classi padre con l’indice.

Per mostrare come vengono utilizzati questi metodi definiti nella classe MyCustomList, vedi sotto nel prompt interattivo Python.

L’esempio mostra come getitem, setitem e delitem può essere chiamato. I metodi magici possono essere chiamati implicitamente. Per _ _ getitem__, per accedere al primo indice, basta scrivere il nome dell’oggetto seguito dalla posizione dell’indice tra parentesi quadre.

La cosa più interessante è che quando chiediamo l’elemento nella posizione dell’indice 1, viene restituito il valore intero 1, anche se 1 è l’elemento zeroth. Quello che abbiamo qui è una lista che inizia con l’indicizzazione a partire da 1. In effetti, sta compensando la confusione che tutti abbiamo avuto quando abbiamo appreso per la prima volta l’indicizzazione delle liste.

Ora, cambiamo il valore intero 1 nell’elenco a 100. Per fare ciò, dobbiamo invocare setitem. Per fare ciò, scriviamo semplicemente il nome dell’oggetto, seguito da parentesi quadre e un compito. Ancora una volta, per cambiare il primo elemento nell’elenco usiamo la posizione dell’indice 1. Quando emettiamo di nuovo l’elenco, possiamo vedere chiaramente che il primo elemento è cambiato da 1 a 100.

Infine, per eliminare un elemento dalla lista__ delitem _ _ può essere definito. Il metodo__ delitem _ _ magic viene invocato, quando usiamo la parola chiave del python che si risolve nella chiamata al metodo__ delitem__. Per costruire ulteriormente sul nostro esempio di indicizzazione elenco, consente di eliminare il primo elemento dell’indice, il valore intero 100. Quando chiamiamo del, seguito dall’oggetto e dalla posizione dell’indice dell’elemento che vogliamo eliminare, in questo esempio, il primo elemento della lista 100, possiamo ora vedere che 100 è stato effettivamente rimosso!

I metodi magici offrono la possibilità di modificare il comportamento predefinito. Meglio di tutti, non c’è bisogno di imparare nuovi nomi di metodi o una nuova interfaccia, in modo che i metodi possono essere intuitivamente implementati. Una guida all’utilizzo di questi metodi magici implementati in MyCustomList è specificata nella tabella seguente.

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

Example 2: Il metodo__ mul _ _ magic

Possiamo anche utilizzare l’operatore di moltiplicazione nel nostro design di classe. Poiché ereditiamo dalla classe list integrata, possiamo comprimere due oggetti MyCustomList insieme (perché agiscono come oggetti list) e scorrere l’oggetto zip. Durante le iterazioni, possiamo moltiplicare gli elementi in ogni lista per il suo elemento corrispondente nell’altra lista in modo broadcast (vedi __mul__ magic method code snippet sotto). Questo comportamento di trasmissione è simile a quello trovato nei pacchetti di analisi dei dati come Panda e Numpy.

L’esempio mostra che possiamo più di due oggetti MyCustomList insieme usando il segno*. Se catturiamo il valore restituito in una variabile chiamata list_three e stampiamo list_three, viene emesso un nuovo elenco. Questa lista è il prodotto di moltiplicare gli elementi l’uno contro l’altro dalle altre 2 liste.

__mul__ è un metodo di MyCustomList classe. Qui, è mostrato in isolamento.

L’operatore di moltiplicazione * risolve un __mul__ la magia chiamata di metodo, che si può personalizzare per restituire il comportamento desiderato.

L’intero codice sorgente per la classe utilizzata in questo esempio, MyCustomList è mostrato di seguito:

Esempio Bonus: Il metodo__ call _ _ magic

Per finire, illustrerò come il metodo __call__ magic in Python può essere invocato. __call__ può essere particolarmente utile nelle classi con istanze che devono cambiare spesso il loro stato. “Chiamare” l’istanza può essere un modo intuitivo ed elegante per cambiare lo stato dell’oggetto.

Considera l’esempio mostrato. Qui, la classe MyClass ha un costruttore init che prevede tre argomenti passati. Questi tre argomenti possono essere passati nella firma del metodo init e assegnati come attributi nell’oggetto.

Il metodo call magic è utile quando vogliamo cambiare lo stato di un’istanza, senza creare effettivamente una nuova istanza.

Quando l’istanza viene inizializzata per la prima volta, passo gli interi 1, 2 e 3, che vengono assegnati rispettivamente come attributi var_1, var_2 e var_3 nell’istanza. Quando uso l’istruzione print per mostrare l’output dell’istanza, obj, usando l’attributo __dict__, posso vedere che a var_1 viene assegnato il valore 1, a var_2 viene assegnato il valore 2 e a var_3 viene assegnato il valore 3.

Ora, proponiamo che vorrei cambiare i valori degli attributi var_1 e var_2 di questa istanza, mantenendo l’attributo var_3 come era quando l’istanza è stata originariamente costruita.

Fare questo è semplice. Definisco un metodo call magic, che consente di ridefinire gli attributi var_1 e var_2. I metodi magici possono essere chiamati implicitamente, il che significa che chiamo semplicemente obj(200, 300) e il metodo di chiamata verrà invocato. Naturalmente, è anche possibile invocare esplicitamente il metodo call, ad esempio obj.__ call _ _ (200, 300), ma il primo metodo sembra più intuitivo. Infine, a scopo dimostrativo, ho stampato l’ID dell’istanza per mostrare definitivamente che abbiamo manipolato lo stesso oggetto.

Il metodo di chiamata può essere definito in due modi. Gli argomenti possono essere passati direttamente nella firma del metodo di chiamata. In alternativa, è possibile utilizzare l’argomento *vars, che cattura tutti gli argomenti passati e li memorizza in una tupla, che può essere decompressa come mostrato sopra.

Il codice sorgente per questo esempio può essere trovato qui sotto.

Sommario

I metodi magici possono arricchire il nostro design di classe dandoci accesso alle funzionalità principali della sintassi. Nei primi esempi, abbiamo il meglio di entrambi i mondi. Possiamo ereditare dalla classe list integrata e modificare particolari metodi in quella classe per personalizzare il comportamento. getitem, setitem e delitem sono stati tutti modificati, ma attraverso l’ereditarietà, eravamo ancora in grado di utilizzare i metodi init e repr() incorporati nella lista, ad esempio.

Possiamo comunicare l’uso degli oggetti con estrema facilità agli altri sviluppatori. Nell’esempio fornito, tutto ciò che dobbiamo dire ai nostri colleghi sviluppatori è che la nostra classe si comporta come una lista, solo un po ‘ diversamente, qui scartiamo l’idea di un indice zeroth. Non c’è bisogno di imparare nuovi metodi nome o una nuova interfaccia.

Inoltre, è stato dimostrato il metodo call magic. Chiamare l’istanza può essere un modo intuitivo ed elegante per modificare lo stato dell’oggetto.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.