Se trovi utile il mio blog sostienimi con una piccola donazione. GRAZIE

14 – Le classi

INDICE ARTICOLI

Dopo l’introduzione su cosa siano una classe e un’oggetto vediamo qual’è la forma più semplice di una classe :

class NomeClasse:
    <istruzione-1>
    .
    .
    .
    <istruzione-N>

Come per le funzioni si inizia col definirne il nome “class NomeClasse” e poi il contenuto identandone il codice come spiegato nelle sezioni precedenti.
La definizione di una classe deve sempre essere eseguita prima del suo utilizzo e quindi normalmente viene implementata subito sotto la sezione degli “include”.

La classe più semplice che si possa creare è una classe vuota :

class foo:
    pass

Nell esempio sopra abbiamo definito una classe di nome foo.
Siccome una classe deve contenere qualcosa l’abbiamo completata con l’istruzione “pass” che significa prosegui (ovvero la classe sopra non fà nulla).
Ora vediamo di scrivere qualcosa di più utile ovvero definiamo una classe persona:

class persona:
    nome = ''
    cognome = ''
    indirizzo = ''
    telefono = ''
    stato_civile = ''

    def cambia_indirizzo(self,s):
        self.indirizzo = s

    def cambia_telefono(self,s):
        self.telefono = s

    def cambia_stato_civile(self,s):
        self.stato_civile = s

    def stampa(self):
        print self.nome,self.cognome,self.indirizzo,self.stato_civile

Nell’esempio sopra abbiamo definito una classe persona con dei dati

  • nome
  • cognome
  • indirizzo
  • telefono
  • stato_civile

che sono gli attributi di questa persona e dei metodi

  • cambia_indirizzo
  • cambia_telefono
  • cambia_stato_civile
  • stampa

che sono le azioni che possiamo richiamare (ovvero le funzioni all’interno della classe stessa).

I dati membro vengono definiti come delle normali variabili in python e se devono essere inizializzti cone dei valori basta una semplice assegnazione.
Per i metodi invece si utilizza la stessa sintassi delle funzioni .
Ogni metodo deve avere come primo parametro l’oggetto stesso, perchè ogni volta che viene
richiamato il metodo, python sistema nel primo parametro il riferimento all’oggetto stesso (se stesso).
Questo permette di accedere ai dati membri appartenenti allo stesso oggetto.
Normalmente si usa chiamare questo parametro “self” (l’equivalente del “this” in C++).

Ora proviamo a instanziare (creare) un’oggetto di tipo persona utilizzando la classe appena creata (che dovrà essere presente nel codice subito al disotto di tutti gli include):

pers = persona() # le parentesi sono obbligatorie
pers.nome = 'Francesco' # assegnazione diretta ai dati membri
pers.cognome = 'Rossi'
pers.cambia_indirizzo('via Teuladal n. 10') # richiamo un metodo per impostare la via
pers.stampa() # risultato : Francesco Rossi via Teulada n. 10

Spesso, quando creiamo un’oggetto, dobbiamo eseguire delle operazioni preliminari come nell’esempio precedente dove abbiamo assegnato dei valori agli attributi ma le operazioni potrebbero essere le più disparate come ad esempio la verifica dell’esistenza di un file .
In python queste operazioni vengono eseguite creando un metodo (funzione) con nome “__init__()”.
Se in una classe viene dichiarato un metodo con questo nome quando verrà instanziato (creato) un oggetto derivato da questa classe verrà eseguita anche la funzione “__init__()”, che espleterà le operazioni di inizializzazione che abbiamo progettato al suo interno.
Abbiamo anche visto che gli attributi possono essere modificati sia direttamente (pers.nome = ‘Francesco’) che tramite un metodo (pers.cambia_indirizzo(‘via Teuladal n. 10’)).
Nel caso volessimo che gli attributi, o una parte di essi, non possa essere modificata in modo diretto ma solo tramite i metodi sarà sufficente anteporre al nome dell’attributo il simbolo “__” ( che è composto da due “_” ) .
Cosi facendo nessuno potrà modificare il dato in modo diretto ma solo utilizzando l’apposita funzione.

Ora vediamo come si può creare una classe derivandola da una già esistente.
Supponiamo di voler creare una classe “studente” che ha tutti gli attributi della classe persona ma in più ha gli attributi scuola e classe e che il metodo stampa emetta anche i dati della scuola.

class studente (persona):
    scuola = ''
    classe = 0

    def cambia_scuola(self,s):
        self.scuola = s
    def promosso(self):
        if self.classe == 5:
            print 'scuola finita'
        else:
            self.classe = self.classe + 1

    def stampa(self):
        print self.nome,self.cognome,self.indirizzo,self.stato_civile
        print 'scuola: '+self.scuola+' classe '+str(self.classe)

Il metodo stampa è polimorfico ovvero assume una forma diversa in base al tipo di oggetto sul quale viene applicato.

Infatti nella classe “persona” il metodo “stampa” è questo :

def stampa(self):
        print self.nome,self.cognome,self.indirizzo,self.stato_civile

mentre nella classe studente il metodo “stampa” è stato ridefinito e quindi sarà questo :

def stampa(self):
        print self.nome,self.cognome,self.indirizzo,self.stato_civile
        print 'scuola: '+self.scuola+' classe '+str(self.classe)

INDICE ARTICOLI