Metodi speciali in Python e funzioni utili per le classi

Esistono molti nomi di cosiddetti metodi speciali  in Python che ci permettono di adattare la nostra classe alla sintassi di Python.

Negli articoli precedenti abbiamo visto come la sintassi di Python sia estremamente concisa e potente.

Pensiamo, per esempio, allo slicing  delle stringhe. 

 

Sarebbe bello poter scrivere classi che possano essere usate con questa sintassi o magari con gli operatori aritmetici e booleani.

Python non ci delude nemmeno stavolta! Infatti è possibile ottenere questo risultato.

Come? Ancora una volta con la naming convention  di cui abbiamo parlato nel precedente articolo.

 

 


In altri linguaggi, questo approccio è chiamato “operator overloading” la cui traduzione letterale è “sovraccarico degli operatori”.

Non è certamente intuitiva, forse sarebbe meglio parlare di “sovrapposizione degli operatori”.


 

Metodi speciali in Python: il metodo speciale __len__

 

La funzione nativa len, che abbiamo visto in diversi esempi, ci permette di valutare la lunghezza di una stringa o di una sequenza.

Se la vogliamo usare anche con una delle nostre classi, dobbiamo implementare il metodo speciale __len__ in questo modo:

 

Metodi speciali in Python: metodo __len__ con le classi

 

 

Metodi speciali in Python: il metodo speciale __str__

 

La funzione nativa str  ci permette invece di convertire in stringa qualsiasi oggetto.

Tra i metodi speciali in Python abbiamo a disposizione un metodo anche per questa funzione, ovvero __str__ :

 

Metodo speciale __str__ per le classi

 

 

I metodi speciali di comparazione

 

Se invece volessimo usare gli operatori booleani di comparazione >, <, ==, <= e >=, i metodi speciali in Python che dovremmo usare sono:

 

  • __gt__ : dove gt  sta per greater than (maggiore di), quindi l’operatore >
  • __lt__ : dove lt  sta per less than (minore di), quindi l’operatore <
  • __eq__ : dove eq  sta per equal (uguale), quindi l’operatore ==
  • __le__ : dove le  sta per less equal (minore o uguale), quindi l’operatore <=
  • __ge__ : dove ge sta per greater equal (maggiore o uguale), quindi l’operatore >=

 

Nel seguente esempio vediamo l’utilizzo di alcuni di questi metodi:

 

Metodi speciali per gli operatori booleani

 

 


Il lungo elenco dei metodi speciali definiti in Python è presente nella documentazione, che possiamo visualizzare premendo F1  da IDLE.

In alternativa, tale elenco è accessibile online nel sito di Python.

Ecco l’indirizzo dal quale possiamo reperire la documentazione riguardante i metodi speciali: clicca qui.


 

Le funzioni getattr, hasattr, setattr e delattr

 

Oltre ai metodi speciali in Python abbiamo anche delle funzioni particolarmente utili per le nostre classi.

Queste funzioni ci permettono di richiamare, controllare l’esistenza, definire e cancellare i metodi e gli attributi dei nostri oggetti.

 

Torniamo alla nostra classe Cibo:

 

Esempio di classe per gestire i cibi

 

 

Vediamo cosa possiamo fare con hasattr, che ci dice se la classe ha un attributo il cui nome è specificato dal secondo parametro:

 

Funzione hasattr per le classi in Python

 

 

Con getattr, che ricordiamo permette di richiamare un metodo, possiamo usare quest’ultimo tramite il suo nome:

 

Funzione gettatr per le classi in Python

 

 

Infine, vediamo un esempio che ci mostra l’uso di setattr  e delattr  che invece definiscono e cancellano metodi e attributi di un oggetto:

 

Funzioni setattr e delattr per le classi in Python

 

 

La funzione super

 

La funzione super  è indispensabile quando abbiamo a che fare con classi che ereditano il loro comportamento da altre classi.

Spesso una classe figlia estende il comportamento di un metodo della classe madre per cui è comodo poter accedere al metodo originario.

 

Vediamo un esempio d’uso di super:

 

Funzione super per le classi in Python

 

 

  • Il primo parametro di super è il nome della classe a partire dalla quale vogliamo risalire nella gerarchia.
  • Il secondo parametro è un’istanza della suddetta classe.

 

In questo caso abbiamo chiesto a Python di andare a recuperare la classe madre dell’oggetto self, che è un’istanza della classe Estesa.

Di questa classe madre noi eseguiamo il metodo costruttore __init__.

 

Vediamo se il comportamento è quello atteso:

 

Prova del comportamento della funzione super

 

 


In nessun punto del costruttore di Estesa abbiamo salvato il valore del colore.

Questa operazione è stata fatta dal costruttore della classe Base.


 

Le funzioni isinstance e issubclass

 

Approfittiamo ancora dell’esempio precedente per scoprire il comportamento delle funzioni isinstance  e issubclass.

Anche se, ammettiamolo, non ci vuole un genio per indovinarlo:

 

Funzione isinstance per le classi in Python

 

 

  • isinstance  quindi, ci permette di capire se un oggetto è un’istanza di una data classe.

Osserviamo come l’oggetto est  sia un’istanza sia della classe Base, sia della classe Estesa.

 

 

Funzione issubclass per le classi in Python

 

 

  • issubclass  accetta come parametri due classi e ci dice se la prima è una sottoclasse della seconda.

Nel nostro caso questo è vero solo per la classe Estesa, sottoclasse di Base.

 

 


 

Abbiamo completato così, anche il nostro excursus sulle classi in Python e su tutto ciò che questo speciale linguaggio di programmazione ci offre per il loro utilizzo.

Non ci resta che passare alla gestione degli input e output, scopriremo le funzioni principali a riguardo e daremo uno sguardo anche ai file!

Non perdere i prossimi articoli!

 

Puoi trovare tutti gli argomenti trattati precedentemente nella sezione dedicata alla guida alla programmazione con Python.

Continua a seguirci e iscriviti alla nostra newsletter  per rimanere aggiornato!

 

newsletter image

 

Una risposta

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*

Per info e contatti