2013-04-25 37 views
7

Im tạo chương trình python đơn giản cung cấp chức năng cơ bản của SMS_Inbox. Tôi đã tạo phương thức SMS_Inbox.Biến toàn cục Python và chức năng lớp học

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 

Trong bit in đậm Tôi nhận được một lỗi:

UnboundLocalError: local variable 'message_count' referenced before assignment. 

Tôi tạo ra một cửa hàng biến toàn cầu mà là một danh sách trống và các công trình này khi tôi sử dụng đối tượng add_new_variable. Tuy nhiên vì lý do nào đó, nó không thêm giá trị vào biến message_count toàn cục của tôi.

Vui lòng giúp

+2

Không biến nào của bạn được gọi là 'số' ... – Eric

+0

Ý của bạn là' message_count'? –

+0

Có nghĩa là trích dẫn: UnboundLocalError: biến cục bộ 'message_count' được tham chiếu trước khi gán – user2318861

Trả lời

9

Đó không phải là cách hoạt động của lớp học. Dữ liệu phải được lưu trữ trong cá thể lớp, không được lưu trữ trên toàn cầu.

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

Nếu nó nằm trong cá thể lớp, nó sẽ duy trì các mục danh sách? – user2318861

+0

@ user2318861: Vâng, đó là vấn đề. –

+0

cảm ơn eric !!!! – user2318861

1

Bạn đang cố gắng để gán cho một biến toàn cầu message_count mà không cần khai báo nó như vậy:

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 

Cố gắng tránh sử dụng globals, hoặc ít nhất là đóng gói các biến như một lớp thuộc tính:

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 

Tuy nhiên, lớp học trường hợp không còn trạng thái nữa, do đó không có điểm khi tạo lớp học tại đây. Nó chỉ phục vụ để gây nhầm lẫn mục đích của bạn.

Trạng thái lưu trữ trong các phiên bản hoặc sử dụng các chức năng toàn cầu (do đó, không sử dụng một lớp nào cả); cái cũ là thích hợp hơn cho cái sau.

Chuyển đổi thiết lập của bạn đến một lớp học có trường hợp tổ chức nhà nước, sử dụng thích hợp PEP-8 styleguide đặt tên và chuỗi định dạng:

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 

Bạn đang sau đó miễn phí để tạo một dụ và sử dụng như một toàn cầu nếu cần là:

sms_store = SMSStore() 

Mã khác chỉ sử dụng sms_store.add_new_arrival(...), nhưng trạng thái được đóng gói trong một trường hợp.

+0

... và không bao giờ làm điều đó. – 7stud

+0

@ 7stud: phụ thuộc vào những gì đếm nên đại diện .. –

+0

Khó để tìm ra ý nghĩa 'tự' giữ ở đây ... – Eric

6

Nếu biến bạn đang đề cập đến là message_count, lỗi là do trong Python, bạn phải chỉ định biến là global trước khi bạn có thể chỉnh sửa với biến đó.

Điều này sẽ hiệu quả.

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 

Theo văn bản trên, bạn muốn được tốt hơn đóng gói nó trong __init__ chức năng thay vì tuyên bố nó global.

Các vấn đề liên quan