User Tools

Site Tools


appunti3s:python_orientato_ad_oggetti

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
appunti3s:python_orientato_ad_oggetti [2018/10/18 21:49]
profpro
appunti3s:python_orientato_ad_oggetti [2020/06/08 22:19] (current)
Line 1: Line 1:
 +====== Python orientato ad oggetti ======
 +
 +>> indice: [[appunti3s:linguaggio_python]]
 +
 +===== Cosa faremo? =====
 +
 +In questo capitolo sarà introdotto un nuovo "stile" con cui possono esssere scritti i programmi e il significato di alcuni nuovi termini, come: //oggetto//, //classe// e //metodo//
 +
 +**NOTA**: Questi appunti sono su ;;python2;; , da aggiornare per python3
 +===== Prerequisiti =====
 +
 +È necessario conoscere i concetti di __tipo di dato__, variabile, funzione e modulo in Python.
 +  * per python2 installare pacchetto python-tk
 +  * per python3 installare pacchetto python3-tk
 +===== Oggetti =====
 +
 +Prima di dire cosa sono gli oggetti, diciamo che in realtà __li abbiamo già usati__ :) 
 +
 +Quando? Quando abbiamo usato le variabili... Anche le variabili sono dei semplici oggetti. Quindi, come prima definizione, si può immaginare che un oggetto è //qualcosa// memorizzato nella memoria e che contiene dei dati. 
 +
 +In generale un oggetto può essere più complesso di una semplice variabile e può contenere più dati di una variabile. Viene chiamato con un termine vago come "oggetto" perché può essere usato per rappresentare qualsiasi cosa sotto forma di numeri nella memoria del computer. Ad esempio, le cosiddette "finestre" del Desktop sono programmi composti da molti oggetti.
 +===== Classi =====
 +
 +Prima di dire cosa sono le classi, diciamo che in realtà __le abbiamo già usate__ :)
 +
 +Quando? Quando abbiamo creato un nuovo oggetto (o una nuova variabile). Le classi sono quei modelli che servono a creare nuovi oggetti. Quindi, come prima definizione, possiamo immaginare una classe come lo //stampo// che serve a creare oggetti. 
 +  * **Quiz** Se abbiamo paragonato la classe ad uno stampo, a cosa paragoneresti gli oggetti così prodotti?
 +
 +Fino ad ora abbiamo usato oggetti che appartengono a tipi predefiniti come 'int', 'float' o 'str', ma da ora possiamo chiamare questi "tipi" con un nuovo nome: **classi** (come una categoria), ma restano sempre dei tipi di dato.
 +
 +==== Esempio ====
 +
 +Vediamo come si creano gli oggetti, a partire da una classe (una categoria, un modello ideale), con un esempio:
 +<file python 20.py>
 +import Tkinter
 +mario = Tkinter.Tk() # Tkinter e' il prefisso del modulo esterno (tk interface) e si puo' trascurare...
 +mario.mainloop()      # loop degli eventi non necessario se uso la modalita' interattiva
 +</file>
 +
 +Tradotto in italiano:
 +  - Importa un modulo
 +  - Crea/costruisce un //oggetto// di nome 'mario'.
 +  - L'oggetto 'mario' e' costruito usando come modello la //classe// //Tk//.
 +  - Notazione: di solito le classi hanno un nome maiuscolo mentre gli oggetti minuscolo...
 +
 +  * Hai provato il precedente codice? Hai creato un oggetto! Riesci anche a vederlo? :) 
 +Non tutti gli oggetti rappresentano qualcosa di visibile. Ad esempio, le variabili sono oggetti, ma non sono visibili... 
 +
 +  * **Esercizio** osservare la seconda riga del precedente codice e rispondere alle seguenti domande:
 +    * cosa è mario?
 +    * cosa è Tk?
 +Terminologia: si dice che mario è oggetto istanza della classe Tkinter.Tk.
 +==== Una prima formula ====
 +
 +{{:appunti3s:magic.png |}}
 +In base a quanto appena visto, per costruire nuovi oggetti basta usare la seguente "formula":
 +<code>nomeOggetto = NomeClasse()</code>
 +  * Consiglio: ricopia questa formula sul quaderno tante volte fino a che non la ricordi. Attenzione alle maiuscole...
 +Le parentesi tonde non sono messe per caso, significa che stiamo usando proprio una funzione... 
 +Questa formula vale anche per le variabili/oggetto di tipo 'int', 'float' e 'str', perché anche loro sono degli oggetti. 
 +<code>numeroint = int(5)</code>
 +Prova ad applicarla anche tu: 
 +  * **Esercizio**: prima di tutto provare a ripetere la formula per verificarne la memorizzazione
 +  * **Esercizio**: provare a costruire un oggetto di tipo 'float', chiamandolo 'numerofloat'
 +  * **Esercizio**: provare a costruire un oggetto di tipo //Turtle// appartenente al modulo //turtle//, chiamandolo 'laTartaruga'
 +
 +<file python 21.py>
 +import turtle
 +laTartaruga = turtle.Turtle() 
 +laTartaruga.shape("turtle"  # una nuova istruzione...
 +</file>
 +  * **Esercizio**: provare a tradurre in italiano le istruzione del precedente esempio, ad eccezione dell'ultima.
 +  * **Quiz**: adesso prova a tentare di indovinare a tradurre in italiano anche l'ultima istruzione, poi continua a leggere...
 +
 +===== Metodi =====
 +
 +Se si notano le parentesi nell'ultima istruzione si può dire che si tratta di una funzione. Si sarà notata, però, anche una differenza dal solito: la chiamata è diversa e usa __un nuovo "stile"__. Queste nuove funzioni hanno anche __un nuovo nome__: **metodi**, ma __restano sempre delle funzioni__. 
 +
 +Aggiungiamo un'ulteriore chiamata ad un altro metodo al precedente esempio:
 +<file python 21bis.py>
 +import turtle
 +laTartaruga = turtle.Turtle() 
 +laTartaruga.shape("turtle"  # chiama un metodo shape
 +laTartaruga.forward(30)       # chiama un metodo forward
 +</file>
 +
 +==== Una seconda formula ====
 +
 +{{:appunti3s:magic2.png |}}In generale, la "formula" per chiamare un metodo è la seguente:
 +<code>nomeOggetto.metodo()</code>
 +  * **Quiz**: A cosa serve la prima formula e a cosa serve la seconda?
 +  * **Quiz**: Si può usare la seconda senza usare la prima?
 +Traducendo in italiano l'ultimo esempio, si ha:
 +  - Crea/costruisce un oggetto di nome 'tartaruga'.
 +  - L'oggetto 'laTartaruga' deve essere costruito usando come modello la classe //Turtle//.
 +  - Si applica il metodo shape("turtle") sull'oggetto 'tartaruga'
 +  - Si applica il metodo forward(30) sull'oggetto 'tartaruga'
 +  - notare che in italiano la frase inglese //oggetto.metodo()// si legge al contrario: metodo su oggetto!
 +
 +Provare a spiegare il seguente esempio, traducendo sempre in italiano:
 +<file python 22.py>
 +parola = str("esempio")
 +print parola, numero
 +print parola.capitalize()
 +</file>
 +  * **Quiz** Completa la seguente frase: Con quest'ultimo esempio si è dimostrato che è possibile passare ...(cosa?)... ad un metodo. Questo perché un metodo è proprio una funzione.
 +  * **Esempio:** provare che il seguente codice aggiuntivo **non** funziona:
 +<code>parola.shape()</code>
 +Questo perché su un oggetto di tipo 'str' si possono applicare __solo__ le funzioni previste per quel tipo di oggetto, cioè per quel tipo di classe.
 +
 +===== Svantaggi =====
 +
 +Potrebbe sorgere una domanda: se utilizzare lo stile della programmazione orientata agli oggetti porta a questo nuovo "limite", o "regola", non sarebbe meglio non usare questo stile, per avere meno regole?
 + 
 +===== Vantaggi =====
 +
 +Inizialmente, aggiungere una regola, può sembrare una complicazione, ma **conoscere le regole** aiuta a scrivere i programmi...
 +
 +Basta immaginare di provare a costruire una casa senza seguire nessuna regola: nessuno ci vieta di fare una casa senza le fondazioni o il tetto, ma poi cosa si ottiene senza regole? Forse un architetto geniale potrebbe ottenere un capolavoro, ma senza regole, tutti gli altri otterrebbero solo disastri.
 +
 +Comunque, questo stile di programmazione non si può applicare sempre, ad esempio, non si possono chiamare le funzioni //len()// o //math.sqrt()// con la sintassi dei metodi.
 +
 +===== Esercizi =====
 +
 +Creare un vocabolario con i nuovi termini e provare a descriverne il significato con parole proprie.
 +
 +Provare a creare nuovi oggetti a partire dalle seguenti classi: 
 +  * etichetta = Tkinter.Label(fabio, text = "ciao a tutti") # questo oggetto non sara' immediatamente visibile, bisogna prima applicare un metodo pack()...
 +
 +Provare ad applicare i seguenti metodi ad oggetti di classe Tkinter.Tk
 +  * fabio.title("il mio programma")
 +  * print Tkinter.Tk.%%__doc__%%
 +  * print Tkinter.Tk.%%__class__%%
 +  * etichetta.pack()
 +  * fabio.destroy()
 +Provare ad applicare i seguenti metodi ad oggetti di classe turtle.Turtle
 +  * tartaruga.color("red", "green")
 +  * tartaruga.circle(25)
 +
 +
 +
 +