Python orientato ad oggetti

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

È 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

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.

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:

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

Tradotto in italiano:

  1. Importa un modulo
  2. Crea/costruisce un oggetto di nome 'mario'.
  3. L'oggetto 'mario' e' costruito usando come modello la classe Tk.
  4. 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

In base a quanto appena visto, per costruire nuovi oggetti basta usare la seguente “formula”:

nomeOggetto = NomeClasse()
  • 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.

numeroint = int(5)

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'
21.py
import turtle
laTartaruga = turtle.Turtle() 
laTartaruga.shape("turtle")   # una nuova istruzione...
  • 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…

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:

21bis.py
import turtle
laTartaruga = turtle.Turtle() 
laTartaruga.shape("turtle")   # chiama un metodo shape
laTartaruga.forward(30)       # chiama un metodo forward

Una seconda formula

In generale, la “formula” per chiamare un metodo è la seguente:

nomeOggetto.metodo()
  • 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:

  1. Crea/costruisce un oggetto di nome 'tartaruga'.
  2. L'oggetto 'laTartaruga' deve essere costruito usando come modello la classe Turtle.
  3. Si applica il metodo shape(“turtle”) sull'oggetto 'tartaruga'
  4. Si applica il metodo forward(30) sull'oggetto 'tartaruga'
  5. 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:

22.py
parola = str("esempio")
print parola, numero
print parola.capitalize()
  • 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:
parola.shape()

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.

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?

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.

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)
  • appunti3s/python_orientato_ad_oggetti.txt
  • Last modified: 2018/10/18 21:49
  • by profpro