Programmazione orientata agli oggetti: le classi
Oggetti e tipi di dati La programmazione che abbiamo visto finora agisce su variabili che appartengono a tipi di dati predefiniti: interi, floating point, stringhe, liste Le variabili sono gli oggetti che il programma manipola Il tipo di dato che definisce cosa è un oggetto è la sua classe Esempio: Il tipo di dato lista è una classe, che descrive un insieme di oggetti che hanno ognuno le loro specificità, ma che hanno una descrizione e degli usi in comune. La funzione print mostra il contenuto di una lista, qualunque sia il suo contenuto (stringhe, numeri o altre liste).
Oggetti e classi La classe è un modello (un contenitore) che definisce la forma di un oggetto, specificando: Come è fatto (i dati) Quali operazioni si possono fare con- e sull oggetto (le funzioni)
Definizione di una classe In Python la classe è una struttura dati che viene definita attraverso la parola riservata class, che informa che si sta definendo una nuova tipologia di oggetti class Punto: pass La prima riga comunica all interprete che si sta definendo una nuova classe che di nome Punto, mentre l istruzione pass nelle seconda riga comunica che la classe è (per ora) vuota
Istanziazione di un oggetto classe Una volta definita una classe, è come aver definito una funziona. L interprete conosce la sua esistenza, ma il programmatore non ha ancora detto ci utilizzarla. Una variabile che viene creata come appartenente ad una classe si chiama anche istanza della classe. Per creare una istanza di una classe devo utilizzare la seguente sintassi: >>>class Punto: pass >>>p1=punto()
Il costruttore L istruzione: var=nomeclasse() crea una variabile di nome var, appartenente alla classe nomeclasse, questo avviene attraverso una funzione particolare (segnalata dalla presenza delle parentesi dopo il nome della classe), che è automaticamente creata quando si definisce una classe e che si chiama costruttore della classe
Attributi Ogni oggetto della classe Punto è caratterizzato dalle sue coordinate cartesiane x,y,z, per cui vorremmo che ogni punto contenesse questa tripletta di valori. pass >>> p1.x=1.0 >>> p1.y=2.0 >>> p1.z=0.5 Queste istruzioni definiscono una classe punto vuota, Creano una variabile p1 di classe punto attraverso la chiamata del costruttore Punto() Infine si dice che la variabile punto è una scatola in cui inseriamo (tramite l operatore. ) tre numeri che chiamiamo x, y e z
Attributi Tutte le variabile che si trovano all interno della scatola definita da una classe si chiamano attributi. Le coordinate x,y,z di un oggetto di classe Punto sono gli attributi di quell oggetto. Per accedere (creare/modificare/visualizzare) agli attributi di un oggetto si utilizza l operatore., come per selezionare una variabile od una funzione di un modulo. pass >>> p1.x=1.0 >>> p1.y=2.0 >>> p1.z=0.5 >>> print p1.x 1.0 >>> p1.x=p1.y+p1.z >>> print p1.x 2.5
Copia di oggetti Si potrebbe pensare di assegnare un oggetto ad un altro, in modo che tutti i suoi attributi venissero copiati in un nuovo oggetto: pass >>> p1.x=1.0 >>> p1.y=2.0 >>> p1.z=0.5 >>> p2=p1 Purtroppo quello che avviene è che p2 e p1 diventano nomi diverso è per lo stesso oggetto, cosicché modificandone uno si modifica anche l altro
Copia di oggetti pass >>> p1.x=1.0 >>> p1.y=2.0 >>> p1.z=0.5 p1 X=1.0 Y=2.0 Z=0.5
Copia di oggetti pass >>> p1.x=1.0 >>> p1.y=2.0 >>> p1.z=0.5 >>> p2=p1 p1 p2 X=1.0 Y=2.0 Z=0.5
Copia di oggetti pass >>> p1.x=1.0 >>> p1.y=2.0 >>> p1.z=0.5 >>> p2=p1 >>> p1.x=3.5 >>> print p2.x 3.5 p1 p2 X=3.5 Y=2.0 Z=0.5
Copia di oggetti Per copiare gli attributi in due istanze diverse della classe si hanno due alternative: 1) Copiare esplicitamente i valori pass >>> p1.x=1.0 >>> p1.y=2.0 >>> p1.z=0.5 >>> p2=punto() >>> p2.x=p1.x 2) Utilizzare la funzionie copy dal modulo copy >>> import copy >>> P2=copy.copy(P1)
Metodi Tutte le funzioni che sono definite all interno di una classe si definiscono metodi della classe. Esse agiscono sempre su almeno una istanza della classe (self). Per definire qual è l oggetto (self) che richiede l utilizzo di un metodo si utilizza la sintassi variabile.metodo() def StampaPunto(self): print self.x, self.y, self.z >>> p1.x=1.0 >>> p1.y=2.0 >>> p1.z=0.5 >>> p1.stampapunto() 1.0 2.0 0.5
Inizializzazione Per garantire che tutti le istanze di una classe abbiano sempre gli attributi corretti, è possibile definire un metodo di inizializzazione che è eseguito ogni volta che venga chiamato il costruttore della classe. def init (self): self.x=0.0 self.y=0.0 self.z=0.0 >>> p1.stampapunto() 0.0 0.0 0.0
Inizializzazione parametrica Sarebbe comodo poter assegnare dei valori arbitrari agli attributi dell oggetto creato durante l inizializzazione. Si vuole che: 1) Se sono presenti dei valori essi vengano assegnati agli attributi 2) Se non sono presenti valori gli attributi siano inizializzati a qualche valore di deafault
Argomenti opzionali delle funzioni Se assegno un valore all argomento di una funzione nella sua definizione, esso viene interpretato come valore di default per quel parametro: Se quando si richiede l esecuzione della funzione, il parametro ha un valore, viene utilizzato all interno della funzione tale valore, Altrimenti viene utilizzato quello di default. >>>def Somma(x=0, y=0, z=0) return x+y+z >>>print Somma() 0 >>>print Somma(1) # assegna x=1, y=0, z=default 1 >>>print Somma(1,2) # assegna x=1, y=2, z=default 3
Inizializzazione parametrica Per inizializzare in maniera parametrica, è possibile utilizzare la stessa strategia usata per gli argomenti opzionali delle funzioni: def init (self,x=0,y=0,z=0): self.x=x self.y=y self.z=z >>> p1.stampapunto() 0.0 0.0 0.0 >>> p2=punto(3,4) >>> p2.stampapunto() 3.0 4.0 0.0
Metodo str Per stampare una variabile tramite la funzione print, Python converte gli argomenti passati alla funzione di stampa in stringhe che vengono poi mostrate a video. La funzione che si occupa di questa conversione è str(). Infatti se scrivessimo non avremmo il risultato desiderato. >>> print p1 < main.punto instance at 0x00C47260>
Metodo str Analogamente al metodo init, dobbiamo scrivere esplicitamente il metodo str che fornisce una stringa maneggiabile da print. def init (self,x=0,y=0,z=0): def str (self): return ("x=" + str(self.x)+" y=" + str(self.y)+ " z="+ str(self.z)) >>> >>> print p1 x=0 y=0 z=0 >>>