[Python] Quando è opportuno usare @staticmethod?

enrico franchi enrico.franchi a gmail.com
Dom 30 Nov 2014 13:06:23 CET


2014-11-29 11:15 GMT+00:00 Marco Ippolito <ippolito.marco a gmail.com>:

> ciao Marco,
> ti ringrazio per la risposta.
>
> Ammetto che faccio fatica a comprendere il caso concreto.
> Entrando nello specifico. Consigli di usare @staticmethod quando è
> utile disaccoppiare il metodo dall'oggetto.
>

Personalmente, suggerisco di guardare staticmethod con sospetto.
Ci sono casi in cui e' utile, indubbiamente. Il commento chiave e':

"""
Avrei potuto utilizzare una normale funzione ma può essere utile avere
tutte le funzioni organizzate sotto lo stesso tetto, oppure può essere
necessario nel caso in cui l'oggetto implementi una specifica
interfaccia.
""""

In particolare, spesso e volentieri volere a tutti i costi usare
staticmethod per fare il mestiere di funzioni (sotto sotto quello sono,
funzioni nel namespace di una classe) e' indice di qualcosa che non
funziona.

Poi ci sono una serie di casi in cui la faccenda puo' anche avere senso
(e.g., si sta implementando uno strategy pattern e si hanno parti della
strategia che davvero non dipendono dalla definizione dell'istanza o della
classe).

In generale, dal mio punto di vista, e' un potenziale smell che sa *molto*
di Javista (ovvero, la maggior parte degli usi di staticmethod che vedo
sono a sproposito, quelli "buoni" sono una minoranza).

A me verrebbe da dirti: capisci come funziona, archivia da qualche parte
che esiste, cerca di non rivolgerti a lui. Ci potrebbero essere casi in cui
devi farlo, e sperabilmente ti sara' chiaro allora. Sospetta quando
succede, valuta le alternative, e se alla fine porta benefici vai senza
paura: e' una feature del linguaggio e non ha nulla di male di per se. Solo
attento a non usarla a sproposito.

Se ad un certo punto ti accorgi che stai facendo classi che sono solo o
principalmente raggruppamenti statici in un namespace di metodi correlati,
metti conto che quello sarebbe il mestiere dei moduli.


-- 
.
..: -enrico-
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20141130/72c38d3f/attachment.html>


Maggiori informazioni sulla lista Python