2013-04-25 24 views
7

Im creando un semplice programma python che fornisce le funzionalità di base di un SMS_Inbox. Ho creato un metodo SMS_Inbox.Variabile globale Python e funzionalità di classe

store = [] 
message_count = 0 
class sms_store: 
    def add_new_arrival(self,number,time,text): 
     store.append(("From: "+number, "Recieved: "+time,"Msg: "+text)) 
     **message_count += 1** 
    def delete(self,i): 
     if i > len(store-1): 
      print("Index does not exist") 
     else: 
      del store[i] 
      message_count -= 1 

nel bit in grassetto sto ottenendo un errore:

UnboundLocalError: local variable 'message_count' referenced before assignment. 

ho creato un negozio variabile globale che è un elenco vuoto e questo funziona quando uso l'oggetto add_new_variable. Tuttavia, per qualche motivo, non sta aggiungendo valori alla mia variabile globale message_count.

Please help

+2

Nessuna delle tue variabili è chiamata 'count' ... – Eric

+0

Intendevi' message_count'? –

+0

Significati per la citazione: UnboundLocalError: variabile locale 'message_count' di riferimento prima dell'assegnazione – user2318861

risposta

9

Non è così che funzionano le classi. I dati devono essere archiviati all'interno dell'istanza della classe, non a livello globale.

class SMSStore(object): 
    def __init__(self): 
     self.store = [] 
     self.message_count = 0 

    def add_new_arrival(self,number,time,text): 
     self.store.append(("From: "+number, "Recieved: "+time,"Msg: "+text)) 
     self.message_count += 1 

    def delete(self, i): 
     if i >= len(store): 
      raise IndexError 
     else: 
      del self.store[i] 
      self.message_count -= 1 

sms_store = SMSStore() 
sms_store.add_new_arrival("1234", "now", "lorem ipsum") 
try: 
    sms_store.delete(20) 
except IndexError: 
    print("Index does not exist") 

print sms_store.store 

# multiple separate stores 
sms_store2 = SMSStore() 
sms_store2.add_new_arrival("4321", "then", "lorem ipsum") 
print sms_store2.store 
+0

Se si trova nell'istanza della classe, manterrà gli elementi dell'elenco? – user2318861

+0

@ user2318861: Sì, questo è il punto. –

+0

grazie eric !!!! – user2318861

1

Si sta tentando di assegnare ad una variabile globale message_count senza dichiararlo come tale:

message_count = 0 

class sms_store: 
    def add_new_arrival(self,number,time,text): 
     store.append(("From: "+number, "Recieved: "+time,"Msg: "+text)) 
     global message_count 
     message_count += 1 

Cercare di evitare l'uso di variabili globali, o almeno incapsulare la variabile come un attributo classe:

class sms_store: 
    message_count = 0 
    store = [] 

    def add_new_arrival(self,number,time,text): 
     sms_store.append(("From: "+number, "Recieved: "+time,"Msg: "+text)) 
     sms_store.message_count += 1 

Tuttavia, le istanze della classe non hanno più lo stato, quindi non c'è punto nel creare una classe qui. Serve solo a confondere il tuo scopo.

O memorizzare lo stato nelle istanze o utilizzare le funzioni globali (quindi non utilizzare affatto una classe); il primo è preferibile al secondo.

Trasformare la configurazione a una classe le cui istanze mantenere lo stato, utilizzando una corretta PEP-8 styleguide denominazione e formattazione di stringhe:

class SMSStore(object): 
    def __init__(self): 
     self.store = [] 
     self.message_count = 0 

    def add_new_arrival(self, number, time, text): 
     self.store.append('From: {}, Received: {}, Msg: {}'.format(number, time, text)) 
     self.message_count += 1 

Siete quindi liberi di creare uno istanza e utilizzare che come un globale, se bisogni sono:

sms_store = SMSStore() 

altro codice utilizza solo sms_store.add_new_arrival(...), ma lo stato è incapsulato in un caso.

+0

... e non farlo mai. – 7stud

+0

@ 7stud: dipende da cosa dovrebbe rappresentare il conteggio .. –

+0

Difficile capire quale significato 'self' tiene qui ... – Eric

6

Se la variabile a cui si fa riferimento è message_count, l'errore è dovuto al fatto che in Python, è necessario specificare una variabile come global prima di poter apportare modifiche con esso.

Questo dovrebbe funzionare.

store = [] 
message_count = 0 
class sms_store: 
    def add_new_arrival(self,number,time,text): 
     global message_count 
     store.append(("From: "+number, "Recieved: "+time,"Msg: "+text)) 
     message_count += 1 
    def delete(self,i): 
     if i > len(store-1): 
      print("Index does not exist") 
     else: 
      global message_count 
      del store[i] 
      message_count -= 1 

Come scritto sopra, si sarebbe meglio incapsulare nella funzione __init__ invece di dichiarare che global.