@staticmethod vs funzione a livello di modulo


21

Non si tratta di @staticmethode @classmethod! So come staticmethodfunziona. Quello che voglio sapere sono i casi d'uso corretti per @staticmethoduna funzione a livello di modulo.

Ho cercato su Google questa domanda, e sembra che ci sia un accordo generale sul fatto che le funzioni a livello di modulo sono preferite rispetto ai metodi statici perché è più pitonica. I metodi statici hanno il vantaggio di essere legati alla sua classe, il che può avere senso se solo quella classe la usa. Tuttavia, in Python la funzionalità è di solito organizzata per modulo non per classe, quindi di solito ha senso anche una funzione di modulo.

I metodi statici possono anche essere sovrascritti da sottoclassi, il che è un vantaggio o uno svantaggio a seconda di come lo si guarda. Sebbene i metodi statici di solito siano "funzionalmente puri", quindi ignorarli potrebbe non essere intelligente, ma a volte può essere conveniente (anche se questo può essere uno di quei tipi di "conveniente, ma MAI FATTO" che solo l'esperienza può insegnarti).

Esistono regole generali per l'uso di metodi statici o di funzioni a livello di modulo? Quali vantaggi o svantaggi concreti hanno (ad esempio estensione futura, estensione esterna, leggibilità)? Se possibile, fornire anche un esempio di caso.

Risposte:


11

Tecnicamente un metodo statico e una funzione del modulo si comportano in modo praticamente identico - In entrambi i casi funzionano come funzioni standard, la differenza è lo spazio dei nomi in cui sono posizionati. Quindi la decisione è più di manutenibilità / leggibilità.

Generalmente userei un metodo statico se alcuni o tutti questi criteri sono soddisfatti:

  • Esiste già una classe esistente con metodi normali
  • La funzione si riferisce agli oggetti della classe in generale, ma non a un'istanza specifica
  • Vuoi essere in grado di chiamare il metodo come se fosse un metodo non statico, forse perché potresti voler rendere il metodo non statico in futuro senza rompere il codice client

0

Un programma è una simulazione di un pezzo di realtà. In questo modo, dipende da come percepisci la realtà.

Una funzione rappresenta alcune attività. Più l'attività è generale, maggiore è la tendenza a simulare l'attività con una funzione. I metodi sono associati alle classi. Più l'attività è specifica della classe, più tende a essere simulata da un metodo.

Pensa alle funzioni trigonometriche. Dì, sin()è così noto che sai che si adatta agli angoli. Sai che vuole un numero float come input e restituisce il float. Ad ogni modo, può esserci un tipo di dati angolo rappresentato da una classe e l' .sin()argomento senza potrebbe essere un metodo normale che funziona con l'oggetto angolo e .sin(x)con un singolo argomento potrebbe essere un metodo statico della classe. Potrei scommettere che più persone pensano che sia meglio fare sin()una semplice funzione. Sono più abituati.

Un altro punto di vista : un modulo ricorda un'istanza di classe. Ha le sue variabili membro e le sue funzioni membro. In un certo senso, implementa un modello singleton. Ogni volta che lo importi da un altro modulo dell'applicazione, ottieni l'accesso esattamente alle stesse variabili e funzioni.


0

Ho una funzione che prenderà come argomento una parte della gerarchia dei dati profondi di un oggetto. Sarebbe scomodo invece passare i vari argomenti necessari per arrivare a quella parte della gerarchia dei dati. Quindi non hai motivo di fare riferimento a sé o a cls. Ma la funzionalità verrà utilizzata solo su parti di oggetti di una particolare classe. Quindi mi sembra un metodo di classe.

Inoltre, preferisco importare il nome della classe ('from module import class' piuttosto che 'import module'). Includere la funzione come metodo statico mi dà accesso al metodo mentre la scrivo come funzione a livello di modulo richiederebbe un'importazione diversa.


2
Se fossi in te, eviterei di rispondere in prima persona. È confusionario. Dovresti invece scrivere in seconda persona al richiedente.
Aaron Hall,

Forse. Stavo fornendo un esempio di utilizzo, che potrebbe corrispondere o meno a ciò che il richiedente aveva in mente.
Dvd Avins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.