2009-05-23 35 views
17

Proprio di lavoro attraverso l'apprendimento di pitone e ha iniziato a guardare funzioni nidificate/fabbrica (semplice esempio):python rispetto alla classe

def maker(N): 
    def action(X): 
     return X * N 
    return action 

Ci sono vantaggi delle funzioni di fabbrica oltre la creazione di una classe? prestazione? memoria? pulire?

risposta

24

Quello che mi piace di più delle funzioni nidificate è che è meno dettagliato delle classi. La definizione di classe equivalente alla funzione maker è:

class clsmaker(object): 
    def __init__(self, N): 
     self.N = N 
    def __call__(self, X): 
     return X * self.N 

che non sembra poi così male fino a quando si inizia ad aggiungere più argomenti al costruttore. Quindi, il modo in classe prende una riga in più per ogni argomento, mentre la funzione ottiene solo gli argomenti in più.

Risulta che v'è un vantaggio di velocità per le funzioni nidificate così:

>>> T1 = timeit.Timer('maker(3)(4)', 'from __main__ import maker') 
>>> T1.timeit() 
1.2818338871002197 
>>> T2 = timeit.Timer('clsmaker(3)(4)', 'from __main__ import clsmaker') 
>>> T2.timeit() 
2.2137160301208496 

Ciò può essere causa di esserci meno codici operativi coinvolti nella versione funzioni nidificata:

>>> dis(clsmaker.__call__) 
    5   0 LOAD_FAST    1 (X) 
       3 LOAD_FAST    0 (self) 
       6 LOAD_ATTR    0 (N) 
       9 BINARY_MULTIPLY  
      10 RETURN_VALUE   
>>> act = maker(3) 
>>> dis(act) 
    3   0 LOAD_FAST    0 (X) 
       3 LOAD_DEREF    0 (N) 
       6 BINARY_MULTIPLY  
       7 RETURN_VALUE 
+3

questa è una differenza di tempo significativa ... risultati interessanti – meade

2

Le funzioni di nidificazione consentono di creare funzioni personalizzate al volo.

Dai un'occhiata ad es. decorators. Le funzioni risultanti dipendono da variabili vincolate al momento della creazione e non devono essere successivamente modificate. Quindi usare una classe per questo scopo renderebbe in meno di senso.

13

Confrontando una fabbrica di funzioni con una classe si confrontano mele e arance. Utilizzare una classe se si dispone di una raccolta coerente di dati e funzioni, denominata insieme un oggetto. Usa una factory di funzioni se hai bisogno di una funzione e vuoi parametrizzarne la creazione.

La scelta delle due tecniche deve dipendere dal significato del codice.

Problemi correlati