Python的全局变量和类功能(Python global variable and class f

2019-09-01 02:39发布

林创建一个简单的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

在加粗一点,我得到一个错误:

UnboundLocalError: local variable 'message_count' referenced before assignment.

我创建了一个全局变量店这是一个空表,这个工作时,我使用add_new_variable对象。 但是由于某种原因,它没有添加值到我的全局变量MESSAGE_COUNT。

请帮忙

Answer 1:

这不是阶级是如何工作的。 数据应该存储类的实例中,不是全局。

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


Answer 2:

如果你指的是变量是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

正如上面写的,你会更好的封装它__init__函数,而不是宣布它的global



Answer 3:

您正在尝试将分配给一个全局变量message_count没有宣布它是这样:

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

尽量避免使用全局变量,或至少封装所述变量作为一属性:

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

然而,你的类的实例没有状态了,所以这里创建类没有意义的 。 它只会迷惑你的目的。

无论是商店状态的情况下,也可以使用全局函数(所以不要使用类的话); 前者优选是后者。

将您的设置到类,其实例保持状态,使用适当的PEP-8风格指南命名和字符串格式化:

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

然后,您可以自由创建一个实例,并使用它作为一个全球性的如果需要的话:

sms_store = SMSStore()

其他的代码只是使用sms_store.add_new_arrival(...)但国家被封装在一个实例。



文章来源: Python global variable and class functionality
标签: python class