# 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): Triangoloclass 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 valoret1.Altezza = 10# Assegno all'ATTRIBUTO Base dell'OGGETTO t (di tipo Triangolo), un valoret1.Base = 22# Calcolo l'area del triangolo (a mano :)) e la scrivoprint "Area di t1 =", (t1.Base*t1.Altezza)/2# Creo un'altro OGGETTO (ISTANZA) della CLASSE Triangolot2 = Triangolo()# Assegno agli ATTRIBUTI Altezza e Base di t2, gli stessi valori dei due ATTRIBUTI di t1t2.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_t1copia_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_t2copia_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 Puntot1.Angolo1 = Punto()# Ora posso assegnare all'OGGETTO dell'ATTRIBUTO Angolo1, dei valori x e y (le coordinate del punto)t1.Angolo1.x = 12t1.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 ]#[ ] [ ]