# TRAINGOLO.PY # by Lorenzo (http://lorenzox.wordpress.com) # Un programmino che propone esempi funzionanti affiancati a commenti esplicativi # sul concetto, funzionamento e caratteristiche di base di classi e oggetti. # Puo' essere riutilizzato, ridistribuito e modificato a piacimento, senza nessuna restrizione. # Ringrazio gli autori di "How to think like a computer scientist: learning with Python", # per l'ottimo libro e gli spunti presi per creare questo file. # Creo un nuovo TIPO di dato composto (o una nuova CLASSE): Triangolo class Triangolo: pass # Creo un nuovo OGGETTO di TIPO Triangolo (ovvero un'ISTANZA della CLASSE Triangolo) t1 = Triangolo() # Assegno all'ATTRIBUTO Altezza dell'OGGETTO t (di tipo Triangolo), un valore t1.Altezza = 10 # Assegno all'ATTRIBUTO Base dell'OGGETTO t (di tipo Triangolo), un valore t1.Base = 22 # Calcolo l'area del triangolo (a mano :)) e la scrivo print "Area di t1 =", (t1.Base*t1.Altezza)/2 # Creo un'altro OGGETTO (ISTANZA) della CLASSE Triangolo t2 = Triangolo() # Assegno agli ATTRIBUTI Altezza e Base di t2, gli stessi valori dei due ATTRIBUTI di t1 t2.Altezza, t2.Base = t1.Altezza, t1.Base # I due OGGETTI di tipo Triangolo (o istanze della CLASSE Triangolo) saranno uguali? if t1 == t2: print "I due OGGETTI (t1 e t2) sono uguali!" else: print "I due OGGETTI (t1 e t2) sono diversi." # Faccio la stessa cosa con i loro ATTRIBUTI (Altezza e Base). Saranno uguali? if (t1.Altezza == t2.Altezza) and (t1.Base == t2.Base): print "Gli ATTRIBUTI di t1 sono uguali agli ATTRIBUTI di t2!" else: print "Gli ATTRIBUTI di t1 sono diversi dagli ATTRIBUTI di t2." # Importo il modulo copy, per copiare degli OGGETTI (e il relativo contenuto) # *NOTA: non e' molto elegante importare un modulo a meta' programma ;) import copy # Copio l'OGGETTO di TIPO Triangolo t1, in un'altro OGGETTO: copia_t1 copia_t1 = copy.copy(t1) # L'OGGETTO t1 e l'OGGETTO copia_t1 saranno uguali? if t1 == copia_t1: print "I due OGGETTI (t1 e copia_t1) sono uguali!" else: print "I due OGGETTI (t1 e copia_t1) sono diversi :(" # Creo un'alias all'OGGETTO t2, in copia_t2 copia_t2 = t2 # Questi saranno uguali? if t2 == copia_t2: print "I due OGGETTI (t2 e copia_t2) sono uguali!" else: print "I due OGGETTI (t2 e copia_t2) sono diversi" # Creo un nuovo tipo di dato (o una nuova CLASSE): Punto # (inteso come punto in un piano cartesiano: (x, y)) # *Note: non molto elegante creare una CLASSE in mezzo al programma ;) class Punto: pass # Assegno all'ATTRIBUTO Angolo1 dell'OGGETTO di tipo Triangolo t1, un OGGETTO di tipo Punto t1.Angolo1 = Punto() # Ora posso assegnare all'OGGETTO dell'ATTRIBUTO Angolo1, dei valori x e y (le coordinate del punto) t1.Angolo1.x = 12 t1.Angolo1.y = 5.3 # In conclusione, abbiamo ottenuto tre OGGETTI di tipo triangolo (t1, t2 e copia_t1), # un alias ad un OGGETTO (copia_t2), due ATTRIBUTI per ognuno (Base e Altezza), un ATTRIBUTO dell'OGGETTO t1, # contenente un'OGGETTO, contenente a sua volta 2 ATTRIBUTI (Angolo1, x, y). # Schematizzato: # #[ ] ---> Base #[ t1 ] ---> Altezza #[ ] ---> [ ] ---> x # [Angolo1] # [ ] ---> y # #[ ] ---> Base #[ t2 ] #[ ] ---> Altezza #[ ] ---> Base #[ copia_t1 ] #[ ] ---> Altezza # # copia_t1 e' stato creato prima di aggiungere l'ATTRIBUTO Angolo1 a t1, quindi esso e' la copia di t1 all'inizio. # In ogni caso, il metodo copy non avrebbe pienamente funzionato, perch non avrebbe copiato l'OGGETTO contenuto # nell'ATTRIBUTO Angolo1. Per copiare TUTTO (in questo caso) occorrerebbe il metodo deepcopy del modulo copy. # #[ ] [ ] #[ copia_t2 ] ---> [ t2 ] #[ ] [ ]