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: 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__ :
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:
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:
Vediamo cosa possiamo fare con hasattr, che ci dice se la classe ha un attributo il cui nome è specificato dal secondo parametro:
Con getattr, che ricordiamo permette di richiamare un metodo, possiamo usare quest’ultimo tramite il suo nome:
Infine, vediamo un esempio che ci mostra l’uso di setattr e delattr che invece definiscono e cancellano metodi e attributi di un oggetto:
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:
- 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:
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:
- 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.
- 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!
Una risposta