Python全局变量和类功能

use*_*861 8 python class

我创建了一个简单的python程序,它提供了SMS_Inbox的基本功能.我创建了一个SMS_Inbox方法.

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
Run Code Online (Sandbox Code Playgroud)

在粗体位我得到一个错误:

UnboundLocalError: local variable 'message_count' referenced before assignment.
Run Code Online (Sandbox Code Playgroud)

我创建了一个全局变量存储,它是一个空列表,这在我使用add_new_variable对象时有效.但是由于某种原因,它没有向我的全局message_count变量添加值.

请帮忙

Eri*_*ric 11

这不是班级的工作方式.数据应存储在类实例中,而不是全局存储.

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
Run Code Online (Sandbox Code Playgroud)


Suk*_*lra 9

如果您指的是变量message_count,那么错误是因为在Python中,您必须像global以前一样使用它来指定变量.

这应该工作.

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
Run Code Online (Sandbox Code Playgroud)

如上所述,最好将其封装在__init__函数中而不是声明它global.