Guida a Python - Corso base - Capitolo 13: classi, oggetti, campi e metodi. Metodi privati e overloading degli operatori.
Capitolo 13: Classi, oggetti, campi e metodi. Metodi privati. Overloading degli operatori.
Le classi di oggetti, in Python, vengono definite utilizzando la parola chiave class, seguita dal nome della classe e dal simbolo : (due punti); dalla riga successiva, nel "blocco" identificato, mediante l'indentazione, come appartenente alla classe, andranno poi definiti campi e metodi.
Esempio:
class figureRegolari:
# corpo della classe
[pass]
Si crea una istanza di una classe mediante la scrittura:
variabileIstanza = nomeClasse([eventuali parametri al costruttore])
ad esempio:
>>> quadrato1 = figureRegolari()
All'interno della classe, ci si riferirà all'oggetto istanziato ("se stesso"; ad esempio, "this" in Java) mediante la parola chiave self, che poi dovrà anche essere il primo parametro di tutti i metodi della classe (costruttore incluso).
Il metodo principale di una classe è il costruttore, che ha sempre firma "interna":
__init__(self, [eventuali parametri])
(due tratti di underscore _ prima e dopo la parola init).
Il parametro self va messo, come detto, sempre come primo parametro dei metodi di una classe (costruttore incluso) nella loro definizione, ma non va passato come parametro quando tali metodi vengono invocati.
self va utilizzato anche per definire gli attributi (campi) della classe.
Esempio:
>>> class quadrato: lato = 0 def __init__(self, l): self.lato = l def getPerimetro(self): return (4*self.lato) def getArea(self): return (self.lato * self.lato) >>>
>>> quadrato1 = quadrato(4) >>> print quadrato1.lato 4
>>> areaQuadrato1 = quadrato1.getArea() >>> print areaQuadrato1 16 >>>
>>> print quadrato1.getPerimetro() 16 >>>
E' possibile definire, all'interno delle classi, dei metodi privati, che potranno essere invocati solo da altri metodi della stessa classe, non "dall'esterno".
Per creare un metodo privato, è sufficiente far precedere il suo nome da 2 tratti di underscore (NON bisogna porre però due tratti di underscore alla fine del nome, vedremo in seguito perchè); ad esempio:
def __metodo1(self, [altri parametri opzionali])
Python, come molti altri linguaggi di programmazione, consente l'overloading degli operatori, ossia di riadattare alle nostre classi alcuni elementi della sintassi di Python, come ad esempio gli operatori relazionali; es.: 3 < 5 ha un senso nella sintassi di base di Python perchè i due valori sono degli interi, ma possiamo definire, nelle nostre classi, il significato di < , in modo da utilizzarlo per confrontare, secondo un criterio, due oggetti (per esempio, persona1 < persona2 potrebbe indicare un confronto in base all'età , per cui se persona1 dovesse avere un campo numerico età con valore inferiore a quello di persona2, il controllo "persona1 < persona2" sarà True).
I metodi "speciali", quelli per i quali è consentito l'overloading, vengono indicati con due tratti di underscore prima e dopo la sigla; sono metodi speciali "di base", ad esempio, i seguenti:
| __len__ |
"Length", lunghezza di qualcosa (una stringa) o numero di elementi in una sequenza (liste, ...). |
| __str__ |
"To string", una versione in stringa (informativa) dell'oggetto (vd. esempio in seguito) |
| __gt__ |
"Greater than", cioè maggiore di (>) |
| __lt__ |
"Less than", cioè minore di (<) |
| __eq__ |
"Equal", cioè uguale a (==) |
| __le__ |
"Less equal", cioè minore uguale a (<=) |
| __ge__ |
"Greater equal", cioè maggiore uguale a (>=) |
Nel caso di operatori, come quelli relazionali, ci si riferirà all'istanza "di sinistra" con self e all'istanza "di destra" con other; a breve un esempio completo.
Esistono, ovviamente, molti altri metodi speciali, ma per una trattazione più approfondita si rimanda alla documentazione ufficiale di Python.
Esempio pratico:
>>> class persona: nome = "" cognome = "" eta = 0 def __init__(self, n, c, e): self.nome = n self.cognome = c self.eta = e def __str__(self): print "Persona con cognome: " + self.cognome + ", nome: " + self.nome + ", età : " + str(self.eta) def __lt__(self, other): return (self.eta < other.eta) >>> miaPersona1 = persona("Mario", "Rossi", 50) >>> miaPersona1.__str__() Persona con cognome: Rossi, nome: Mario, età : 50 >>> miaPersona2 = persona("Giorgio", "Bianchi", 40) >>> miaPersona1 < miaPersona2 False >>>
|