@staticmethod vs funzione a livello di modulo

13

Non si tratta di @staticmethod e @classmethod ! So come funziona staticmethod . Quello che voglio sapere sono i casi d'uso corretti per @staticmethod rispetto a una 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 siano preferite rispetto ai metodi statici perché è più pitoniosa. I metodi statici hanno il vantaggio di essere vincolati alla sua classe, il che può avere senso se solo quella classe lo usa. Tuttavia, in Python la funzionalità è solitamente organizzata dal modulo e non dalla classe, quindi di solito è utile anche renderla una funzione del modulo.

I metodi statici possono anche essere sovrascritti dalle sottoclassi, il che è un vantaggio o uno svantaggio a seconda di come lo si guarda. Anche se, i metodi statici sono solitamente "funzionalmente puri", quindi potrebbe non essere intelligente, ma a volte può essere conveniente (anche se questo potrebbe essere uno di quei "comodi, ma NON FARE" tipo di cose che solo l'esperienza può insegnare).

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

    
posta darkfeline 25.10.2012 - 06:02
fonte

3 risposte

7

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

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

  • Esiste già una classe esistente con i 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, probabilmente perché potresti voler rendere il metodo non statico in futuro senza rompere il codice client
risposta data 15.11.2012 - 13:33
fonte
0

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

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

Pensa alle funzioni trigonometriche. Dì, il 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, ci può essere un tipo di dati angolare rappresentato da una classe e il .sin() senza argomento potrebbe essere un metodo normale che lavora 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 rendere sin() una semplice funzione. Sono più abituati.

Un altro punto di vista : un modulo assomiglia a 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.

    
risposta data 25.10.2012 - 15:58
fonte
0

Ho una funzione che prenderà parte alla gerarchia dei dati profondi di un oggetto come argomento. Sarebbe ingombrante, invece, passare i diversi argomenti necessari per arrivare a quella parte della gerarchia dei dati. Quindi non avere motivo di fare riferimento a sé o ai 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 ('dal modulo import class' piuttosto che 'import module'). Includere la funzione come metodo statico mi consente di accedere al metodo mentre lo scrivo poiché una funzione a livello di modulo richiederebbe un'importazione diversa.

    
risposta data 29.04.2016 - 03:11
fonte

Leggi altre domande sui tag