
Le classi in Python
Le classi in Python sono un concetto fondamentale della programmazione orientata agli oggetti (OOP).
Cos'è una classe? Una classe è come un modello o una bozza che definisce come creare un certo tipo di oggetto. Un oggetto, in questo contesto, è una raccolta di variabili (chiamate attributi o proprietà) e funzioni (chiamate metodi) che agiscono su queste variabili.
Ecco un esempio pratico.
Per definire una classe in Python devi utilizzare la parola chiave class.
- class Person:
- age = 25
In questo caso, Person è una semplice classe con un singolo attributo o proprietà "age".
Per convenzione il nome di una classe inizia con una lettera maiuscola.
A differenza di una funzione, il codice contenuto nella classe viene eseguito immediatamente al momento della sua definizione.
Per creare un oggetto (o un'istanza) di questa classe, utilizza la seguente sintassi:
Tom = Person()
Gli oggetti creati tramite una classe sono detti istanze della classe.
Ora la variabile Tom è un oggetto della classe Person.
Per accedere alla proprietà "age" dell'oggetto puoi scrivere Tom.age.
print(Tom.age)
Python accede alla proprietà "age" dell'oggetto Tom e restituisce 25.
25
Le classi diventano molto più potenti quando iniziamo ad aggiungere metodi.
I metodi sono delle funzioni definite all'interno della classe ed ereditate dagli oggetti.
Ad esempio:
- class Person:
- #esempio di proprietà
- age = 25
- # esempio di metodo
- def greet(self):
- return "Hello"
In questo caso, greet è un metodo della classe MyClass.
Puoi chiamare questo metodo in qualsiasi istanza della classe.
- Mary = Person()
- print(Mary.greet())
Python definisce un oggetto della classe Person nella variabile Mary.
Poi esegue il metodo greet() e stampa "Hello" sullo schermo,
Hello
In pratica, puoi chiamare il metodo greet() in tutti gli oggetti istanza della classe Person.
In questo caso, sia dall'oggetto Mary che dall'oggetto Tom.
Tutte le istanze, ossia gli oggetti, di una classe ereditano gli stessi attributi e metodi della classe.
Per verificare se un oggetto è un'istanza di una classe, puoi usare la funzione isinstance()
Ad esempio, verifica se l'oggetto Mary è un'istanza della classe Person.
isinstance(Mary, Person)
La funzione isinstance() restituisce True perché l'oggetto è effettivamente un'istanza della classe Person
True
Il metodo __init__
Un metodo speciale che le classi possono avere è chiamato __init__ , dove il nome "init" è posto tra due doppi underscore.
Questo metodo viene chiamato automaticamente da Python quando crei un'istanza della classe.
In genere è utilizzato per inizializzare gli attributi dell'oggetto.
Ad esempio, crea questa classe
- class Person:
- # esempio di metodo init
- def __init__(self, name, age):
- self.name = name
- self.age = age
- # esempio di metodo
- def greet(self):
- return f"Hello, my name is {self.name} and I'm {self.age} years old."
In questo caso, quando crei un'istanza della classe Person, devi fornire un nome e un'età tra le parentesi tonde.
Questi valori sono utilizzati per inizializzare gli attributi "name" e "age" dell'oggetto.
Fai attenzione perché è obbligatorio definire i parametri. Se non passi i parametri richiesti dal metodo __init__, Python restituisce un errore.
Ad esempio, crea un oggetto Student usando la classe Person.
Student = Person("Alice", 23)
Nella variabile Student viene memorizzato un oggetto della classe Person.
Alle proprietà "name" e "age" dell'oggetto sono assegnati i valori "Alice" e "23" passati come parametri tra le parentesi tonde.
I parametri devono essere separati tra loro tramite una virgola.
Ora chiama il metodo greet() dell'oggetto Student.
print(Student.greet())
Python esegue il metodo, accede al contenuto delle proprietà "name" e "age" e stampa a video questa stringa
"Hello, my name is Alice and I'm 23 years old."
Gli attributi speciali di una classe
Gli attributi speciali in Python permettono agli sviluppatori di personalizzare il comportamento delle classi.
Sono riconosciuti grazie alla loro sintassi con doppio underscore all'inizio e alla fine (__nome__).
Ad esempio, per ottenere il nome della classe basta consultare l'attributo __name__
class foo():
pass
print(foo.__name__)
foo
Altri attributi utili di una classe sono i seguenti:
- __module__
Restituisce il nome del modulo in cui è definita la classe. - __init__(self, [...])
È il costruttore di una classe. Viene chiamato quando viene creato un nuovo oggetto di quella classe. Utilizzato per l'inizializzazione degli attributi dell'oggetto. - __getattr__(self, name)
Viene chiamato quando si accede a un attributo che non esiste nel normale namespace dell'oggetto. - __setattr__(self, name, value)
Intercetta tutte le assegnazioni di attributi. - __del__(self)
È il distruttore. Se definito, viene chiamato quando un oggetto viene distrutto. - __call__(self, [...])
Rende l'istanza della classe "chiamabile" come se fosse una funzione. - __delattr__(self, name)
Definisce il comportamento quando un attributo viene cancellato con del.
Oltre a questi attributi speciali ce ne sono molti altri.
Questo tutorial è solo un'introduzione molto basilare alle classi in Python.
Le classi possono fare molto di più, inclusa l'ereditarietà, l'incapsulamento e il polimorfismo, che sono concetti chiave della programmazione orientata agli oggetti.
Sono concetti che approfondiremo insieme nelle prossime lezioni del corso Python.