[Gruppo FCM] FCM 30 - How-to - Programmare in Python - Parte 4

Giuseppe Calà jiveaxe a gmail.com
Mer 25 Nov 2009 17:50:30 GMT


HOW-TO Programmare in Python - Parte 4
Scritto da Greg Walters

Vi avevo promesso che avremmo parlato delle classi. Così, ecco su cosa ci concentreremo. Cosa sono le classi e a che cosa servono?

La classe è un mezzo per la costruzione di oggetti. Un oggetto è semplicemente un modo di raggruppare attributi e comportamenti. So che sembra confuso, ma continuiamo. Ragionate in questo modo. Un oggetto è un modello di qualcosa del mondo reale. La classe è una via per implementarlo. Per esempio, a casa ho tre cani. Un Beagle, un Labrador e un Pastore Tedesco/Blue Heeler. Tutti sono cani, ma sono anche differenti tra loro. Accanto ad attributi comuni, troviamo anche differenze. Per esempio, il Beagle è piccolo, grassottello, marrone e irritabile. Il Labrador è di taglia media, nero e tranquillo. Il Pastore è alto, magro, nero e un pò pazzerello. Ovviamente, alcuni attributi sono ovvi. Piccolo/taglia media/alto sono tutti attributi collegati all'altezza. Irritabile/tranquillo/pazzerello sono attributi dell'umore. Dal punto dei vista dei comportamenti, possiamo considerare mangiare, dormire, giocare, e altre azioni.

Tutti e tre saranno della classe 'Cane'. Considerando gli attributi usati per descriverli, potremmo usare Cane.Nome, Cane.Altezza, Cane.Corporatura (magro,grassottello, ecc.) e Cane.Colore. Poi abbiamo i comportamenti come Cane.Abbaia, Cane.Mangia,Cane.Dormi, e così via.

Come detto prima, i tre cani sono di razze distinte. Ciascuna razza sarà una sottoclasse della classe Cane. In un diagramma, sarebbero così rappresentati.

       /--Beagle
Dog ---|--Labrador
       \--Pastore/Heeler

Ciascuna sottoclasse eredita gli attributi della classe Cane. Quindi, se creiamo una istanza di Beagle, essa erediterà tutti gli attributi dalla sua classe genitore, Cane.

Beagle = Cane()
Beagle.Nome = 'Archie'
Beagle.Altezza = 'Piccolo'
Beagle.Corporatura = 'Grassottello'
Beagle.Colore = 'Marrone'

Inizia ad avere senso? Allora, creiamo la nostra classe Cane (mostrata sopra). Inizieremo con la parola chiave "class" e il nome della classe.

class Cane():
    def __init__(self,nomecane,colorecane,altezzacane,corporaturacane,umorecane,etacane):
        #qui imposteremo gli attributi del nostro cane
        self.nome = nomecane
        self.colore = colorecane
        self.altezza = altezzacane
        self.corporatura = corporaturacane
        self.umore = umorecane
        self.eta = etacane
        self.Affamato = False
        self.Stanco = False

Prima di procedere ulteriormente, osservare le funzioni definite. La funzione  __init__ (due underscore + 'int' + due underscore) è di inizializzazione ed è usabile in ogni classe. Questa routine è la prima ad essere eseguita chiamando la classe. In questo caso abbiamo usato una serie di parametri per impostarne alcune semplici informazioni; abbiamo le variabili nome, colore, altezza, corporatura, umore, età, affamato e stanco. Ci ritorneremo su a breve. Ora aggiungiamo altro codice.

Beagle = Cane('Archie','Marrone','Piccolo','Grassottello','Irritabile',12)
print Beagle.nome
print Beagle.colore
print Beagle.umore
print Beagle.Affamato

Si tratta di codice NON INDENTATO che risiede al di fuori della classe. Con la prima riga si crea una istanza della classe cane chiamata Beagle. Nel farlo, abbiamo passato delle informazioni come il nome, il colore, ecc, del Beagle. Le quattro righe successive servono a recuperare le informazioni. Ancora altro codice. Aggiungete alla classe le righe del riquadro in alto a destra, dopo la funzione __init__.

def Mangia(self):
    if self.Affamato:
        print 'Yum Yum...Num Num'
        self.Affamato = False
    else:
        print 'Sniff Sniff...Non ho fame'
def Dormi(self):
    print 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
    self.Stanco = False

Le possiamo richiamare con Beagle.Mangia() o Beagle.Dormi(). Aggiungiamo un altro metodo. Lo chiameremo Abbaia. Il suo codice è mostrato a destra.

def Abbaia(self):
    if self.umore == 'Irritabile':
        print 'GRRRRR...Woof Woof'
    elif self.umore == 'Tranquillo':
        print 'Yawn...ok...Woof'
    elif self.umore == 'Pazzerello':
        print 'Abbaia Abbaia Abbaia Abbaia Abbaia'
    else:
        print 'Woof Woof'

Questa l'ho resa più flessibile. A seconda dell'umore del cane, il guaito cambierà. Nella prossima pagina c'è l'intero codice della classe.

Così, eseguendolo otterremo:

Mi chiamo Archie
Il mio colore è Marrone
Il mio umore è Irritabile
Ho fame = False
Sniff Sniff...Non ho fame
Yum Yum...Num Num
GRRRRR...Woof Woof

Questo è quanto per il vecchio Irritabile Beagle. Però, prima avevo detto di avere 3 cani. Dato che abbiamo creato la classe con cura, quello che ci resta da fare è crearne altre due istanze.

Labrador = Cane('Nina','Nero','Media','Pesante','Tranquillo',7)
Pastore = Cane('Bear','Nero','Alto','Magro','Pazzerello',9)
print 'Mi chiamo %s' % Labrador.nome
print 'Il mio colore è %s' % Labrador.colore
print 'Il mio umore è %s' % Labrador.umore
print 'Ho fame = %s" % Labrador.Affamato
Labrador.Abbaia()
Pastore.Abbaia()

Notate come abbia creato le istanze di entrambi i cani prima delle istruzioni print. Non è un problema, perché ho "definito" le istanze prima di aver chiamato uno dei metodi. Ecco l'output di tutto il programma:

Mi chiamo Archie
Il mio colore è Marrone
Il mio umore è Irritabile
Ho fame = False
Sniff Sniff...Non ho fame
Yum Yum...Num Num
GRRRRR...Woof Woof
Mi chiamo Nina
Il mio colore è Nero
Il mio umore è Tranquillo
Ho fame = False
Yawn...ok...Woof
Abbaia Abbaia Abbaia Abbaia Abbaia

Ora che avete le basi, il vostro compito sarà espandere la classe per includere nuovi metodi, come Gioca o IncontraCaneStrano o simili.

La prossima volta discuteremo della programmazione di GUI o Interfaccia Grafica Utente. Useremo per lo scopo Boa Constructor.

class Cane():
    def __init__(self,nomecane,colorecane,altezzacane,corporaturacane,umorecane,etacane):
        #qui imposteremo gli attributi del nostro cane
        self.nome = nomecane
        self.colore = colorecane
        self.altezza = altezzacane
        self.corporatura = corporaturacane
        self.umore = umorecane
        self.eta = etacane
        self.Affamato = False
        self.Stanco = False

    def Mangia(self):
        if self.Affamato:
            print 'Yum Yum...Num Num'
            self.Affamato = False
        else:
            print 'Sniff Sniff...Non ho fame'

    def Dormi(self):
        print 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
        self.Stanco = False

    def Abbaia(self):
        if self.umore == 'Irritabile':
            print 'GRRRRR...Woof Woof'
        elif self.umore == 'Tranquillo':
            print 'Yawn...ok...Woof'
        elif self.umore == 'Pazzerello':
            print 'Abbaia Abbaia Abbaia Abbaia Abbaia'
        else:
            print 'Woof Woof'

Beagle = Cane('Archie','Marrone','Piccolo','Grassottello','Brontolone',12)
print 'Mi chiamo %s' % Beagle.nome
print 'Il mio colore è %s' % Beagle.colore
print 'Il mio umore è %s' % Beagle.umore
print 'Ho fame = %s' % Beagle.Affamato
Beagle.Mangia()
Beagle.Affamato = True
Beagle.Mangia()
Beagle.Abbaia()


Greg Walter è il proprietario della RainyDay Solutions, LLC, una società di consulenza in Aurora, Colorado e programma dal 1972. Ama cucinare, fare escursioni, ascoltare musica e passare il tempo con la sua famiglia.


-- 
Giuseppe Calà
OpenPGP key: 0x749487B5

Cartella pubblica Google Docs, traduzioni FCM:
https://docs.google.com/leaf?id=0B3roauHJ2VmzMGQ1NWM1OTYtZTEyNC00NDMwLWIzYjAtMDdhMWIwOTE0ZjVl&hl=it
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://liste.ubuntu-it.org/pipermail/ubuntu-it-fcm/attachments/20091125/8b1b7115/attachment.html>
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        non disponibile
Tipo:        application/pgp-signature
Dimensione:  197 bytes
Descrizione: This is a digitally signed message part.
URL:         <http://liste.ubuntu-it.org/pipermail/ubuntu-it-fcm/attachments/20091125/8b1b7115/attachment.pgp>


Maggiori informazioni sulla lista ubuntu-it-fcm