2013-10-17 15 views
5

Si consideri il seguente codice:Assegnazione di una variabile direttamente a una funzione in Python

def apples(): 
    print(apples.applecount) 
    apples.applecount += 1 

apples.applecount = 0 
apples() 
>>> 0 
apples() 
>>> 1 
# etc 

Si tratta di una buona idea, cattiva idea o devo solo distruggere me stesso? Se ti stai chiedendo perché lo vorrei, ho una funzione che si ripete ogni 4 secondi, usando win32com.client.Dispatch() utilizza il COM di Windows per connettersi a un'applicazione. Penso che non sia necessario ricreare quel collegamento ogni 4 secondi. Potrei ovviamente usare una variabile globale, ma mi stavo chiedendo se anche questo sarebbe stato un metodo valido.

risposta

4

È fondamentalmente un namespace globale. La tua funzione apples() è un oggetto globale e gli attributi su quell'oggetto non sono meno globali.

È solo marginalmente migliore di una variabile globale regolare; lo spazio dei nomi in generale è una buona idea, dopotutto.

5

Sarebbe più idiomatica di utilizzare una variabile di istanza di una classe per mantenere il conteggio:

class Apples: 
    def __init__(self): 
     self._applecount = 0 

    def apples(self): 
     print(self._applecount) 
     self._applecount += 1 

a = Apples() 
a.apples() # prints 0 
a.apples() # prints 1 

Se è necessario fare riferimento solo la funzione stessa, senza il riferimento a, si può fare questo:

a = Apples() 
apples = a.apples 

apples() # prints 0 
apples() # prints 1 
+1

Grande suggerimento. Fondamentalmente, quando vuoi mettere insieme lo stato (sotto forma di variabili esplicite) e la funzionalità, quello che vuoi è di solito una classe. – abarnert

Problemi correlati