
I metodi di classe in Python
I metodi di classe in Python sono un tipo speciale di metodi che ricevono la classe come primo argomento implicito, anziché l'istanza.
Questi metodi sono utili quando è necessario accedere o modificare lo stato della classe stessa piuttosto che quello di una singola istanza.
Per definire un metodo di classe, si utilizza il decoratore @classmethod.
class nomeClasse:
@classmethod
def nomeMetodo(cls):
print(id(cls))
Il primo parametro del metodo di classe è convenzionalmente chiamato cls, che rappresenta la classe a cui appartiene il metodo.
Ecco un esempio per chiarire:
Definisci la classe "miaClasse" con un metodo di classe al suo interno chiamato "miaMetodo".
class miaClasse:
@classmethod
def mioMetodo(cls):
print(id(cls))
Il metodo mioMetodo() non fa altro che restituire il numero identificativo della classe.
Ora chiama il metodo di classe
miaClasse.mioMetodo()
93842345589184
Il numero identificativo della classe è 93842345589184.
Per verificarlo puoi usare l'istruzione id()
print(id(miaClasse))
93842345589184
Crea un'istanza della classe "miaClasse"
p = miaClasse()
Puoi chiamare il metodo di classe mioMetodo() anche tramite l'istanza
p.mioMetodo()
93842345589184
Il risultato è sempre lo stesso.
Nota che anche se chiami il metodo di classe `mioMetodo` tramite un'istanza di `miaClasse`, la classe viene passata automaticamente come primo argomento. Questo è evidente dall'id stampato, che è lo stesso dell'id della classe `miaClasse`. Per questa ragione il parametro cls deve essere sempre indicato quando definisci un metodo di classe.
Se provi a definire un metodo di classe senza specificare il parametro cls, ottieni un errore poiché la classe viene comunque passata come primo argomento implicito:
Ad esempio, definisci il metodo di classe senza il parametro cls.
class miaClasse:
@classmethod
def mioMetodo():
print('test')
Se ora chiami il metodo foo come metodo di classe, Python restituisce un errore.
miaClasse.mioMetodo()
TypeError: miaClasse.mioMetodo() takes 0 positional arguments but 1 was given
Infine, ricorda che i metodi di classe sono riconosciuti come oggetti di tipo `method`:
import types
print(type(miaClasse.mioMetodo))
<class 'method'>
In sintesi, i metodi di classe sono un modo per definire comportamenti che coinvolgono la classe stessa piuttosto che le sue istanze, e sono identificati dall'uso del decoratore `@classmethod` e dal parametro `cls`.