3.1 Creazione di una classe
Creare classi in Python è una parte importante della programmazione orientata agli oggetti (OOP). Le classi permettono di creare nuovi tipi di dati, che possono avere i propri attributi e metodi. Diamo un'occhiata ai concetti di base e agli esempi di creazione di classi in Python.
Concetti di base
- Classe: un modello per la creazione di oggetti. La classe definisce attributi e metodi che avranno gli oggetti di quella classe.
- Oggetto: un'istanza della classe. Un oggetto possiede tutti gli attributi e i metodi definiti nella classe.
- Attributo: una variabile associata a una classe o a un oggetto.
- Metodo: una funzione associata a una classe o a un oggetto.
Gli attributi sono, in sostanza, variabili interne dell'oggetto o della classe. I metodi sono funzioni definite all'interno della classe. Questi termini provengono dall'OOP e vengono usati al pari di funzioni e variabili.
Per dichiarare (creare) una nuova classe si utilizza la parola chiave class. La sintassi generale di questa operazione è la seguente:
class NomeClasse:
variabile1 = valore1
variabileN = valoreN
def funzione1(self):
codice funzione
def funzioneM(self):
codice funzione
In pratica, si può dire che una classe è un piccolo programma (variabili + funzioni), inserito in un'area nominata separata — NomeClasse.
Dopo aver creato una classe, puoi creare oggetti (istanze) di quella classe. Questo codice appare ancora più semplice:
variabileX = NomeClasse()
Importante! I nomi delle variabili e dei metodi in Python sono solitamente scritti con la lettera minuscola. I nomi delle classi sono scritti con la maiuscola. Inoltre, nei nomi delle classi non si usano i caratteri di sottolineatura. Se il nome della classe deve essere composto da più parole, ognuna di esse è scritta con la maiuscola.
Se vuoi accedere a una variabile della classe/oggetto, di solito questo codice ha questo aspetto:
variabileX.variabile1 = 10
variabileX.funzioneM()
Ma qui ci sono delle sfumature, di cui sotto...
3.2 Lavorare con l'oggetto
Sia la classe che un'istanza della classe (oggetto della classe) sono oggetti, quindi sia il primo che il secondo possono avere le proprie variabili e metodi.
Esistono due tipi di variabili:
- Attributo/Variabile/Campo della classe
(class property) - Attributo/Variabile/Campo dell'oggetto
(object property)
Ci sono anche tre tipi di metodi:
- Metodo/Funzione della classe
(class method) - Metodo/Funzione dell'oggetto
(instance method) - Metodo statico
(static method)
I metodi si differenziano per il modo in cui vengono dichiarati e per come vengono chiamati.
Metodi dell'oggetto
Quando dichiari un metodo dell'oggetto, devi passare il primo parametro obbligatorio — self. Quando chiami il metodo, a questo parametro viene passata un riferimento all'oggetto (instance).
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
my_object = MyClass()
my_object.instance_method()
Nell'esempio sopra, quando la funzione instance_method() ha iniziato a essere eseguita, al parametro self è stato passata un riferimento all'oggetto my_object.
Metodi della classe
Quando dichiari un metodo della classe, devi anche passare il primo parametro obbligatorio — cls. Quando chiami il metodo, a questo parametro viene passata un riferimento alla classe (class object). Inoltre, il metodo della classe deve essere decorato con il decoratore classmethod, come nell'esempio sotto:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
Nell'esempio sopra, quando la funzione class_method() ha iniziato a essere eseguita, al parametro cls è stato passata un riferimento alla classe MyClass.
Metodo statico
Quando dichiari un metodo statico, non devi passare nulla, ma neppure può accedere ai dati interni della classe. Anche il metodo deve essere decorato con il decoratore staticmethod, come nell'esempio sotto:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
@staticmethod
def static_method():
return "Questo metodo non dipende da istanza o classe"
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method()
Il metodo statico viene chiamato in modo simile al metodo della classe, ma non vengono passati né riferimento all'oggetto, né riferimento alla classe.
3.3 Variabili della classe
Variabili della classe
Per dichiarare una variabile (attributo) della classe, è sufficiente dichiararla in qualsiasi punto all'interno della classe. Di solito questo viene fatto all'inizio, prima della dichiarazione dei metodi della classe. Esempio:
class MyClass:
attribute = "Sono un attributo della classe"
@classmethod
def class_method(cls):
print(cls.attribute) # Sono un attributo della classe
my_object = MyClass()
MyClass.class_method()
Se vuoi leggere o scrivere un valore in una variabile della classe, utilizza l'oggetto cls.
In linea di principio, puoi accedere a una variabile della classe anche attraverso il nome della classe:
class MyClass:
attribute = "Sono un attributo della classe"
@classmethod
def class_method(cls):
print(MyClass.attribute) # Sono un attributo della classe
my_object = MyClass()
print(MyClass.attribute) # Sono un attributo della classe
Variabili/campi dell'oggetto
Le variabili dell'oggetto (instance) sono i campi dell'oggetto self. Lavori semplicemente con loro tramite self.name. È proprio per questo che l'oggetto self viene passato a ogni metodo dell'oggetto.
Esempio:
class MyClass:
attribute = "Sono un attributo della classe"
def set_name(self, name):
self.name = name
def print_name(self):
print(self.name)
my_object = MyClass()
my_object.set_name("Campo dell'oggetto chiamato name")
my_object.print_name() # "Campo dell'oggetto chiamato name"
Ogni volta che chiami un metodo dell'oggetto, come primo parametro (self) viene passata una riferimento all'oggetto, su cui chiami il metodo. Diversi metodi dell'oggetto possono accedere a dati comuni tramite l'uso dell'oggetto self.
GO TO FULL VERSION