Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python全局变量和类功能_Python_Class - Fatal编程技术网

Python全局变量和类功能

Python全局变量和类功能,python,class,Python,Class,我正在创建一个简单的python程序,它提供了SMS_收件箱的基本功能。我已经创建了一个SMS_收件箱方法 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**

我正在创建一个简单的python程序,它提供了SMS_收件箱的基本功能。我已经创建了一个SMS_收件箱方法

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对象时,它就可以工作了。但是,由于某些原因,它没有向我的全局消息\u count变量添加值


请帮助

这不是上课的方式。数据应该存储在类实例中,而不是全局存储

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

您试图分配给一个全局变量
message\u 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 styleguide命名和字符串格式,将设置转换为实例保持状态的类:

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存储。添加新到达(…),但状态封装在一个实例中。

如果您引用的变量是
消息计数
,则错误是因为在Python中,您必须将变量指定为
全局
,然后才能对其进行编辑

这应该行得通

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

如上所述,您最好将其封装在
\uuuu init\uuuu
函数中,而不是将其声明为
global

您的变量中没有一个被称为
count
…您的意思是
message\u count
?意思是引用:UnboundLocalError:local变量'message\u count'在赋值之前引用它很简单。在使用message_count的每个函数中,只需将全局message_count添加为第一条语句。不用说,总的来说,根本不应该使用这种方法。如果绝对必要,请使用类变量。必须问,当您可以只执行
len(store)
?时,为什么您有
message\u count
?…并且永远不要这样做。@Eric:是的,OP可能根本不想使用全局状态,或者不应该使用类。我想使用全局状态。为什么?我想保留收件箱中所有邮件的记录。因此,我根据对象调用相应地调整消息计数,以添加或删除新到达的消息。非常感谢。我将使用init属性。我希望它能维护self.store和self.message_计数中的条目,这样它就不会在每次执行类实例时重置。@user2318861:扩展为使用一个实例作为全局状态。如果它在类实例中,它会维护列表项吗?@eric self.store和self.message_count的实例没有像我希望的那样记录/保存值。它只是记录添加新到达的实例,而不是记录在列表中以供进一步编辑和添加。。比如一个全局变量。因此,我是否必须使用全局变量方法,在类外创建存储列表和消息计数,并在类实例中将其作为全局变量引用?@user2318861:我完全不知道您想说什么。@eric您在init下创建了存储(列表)和消息计数。我想说的是,这将只适用于记录一个实例。它不会像全局变量那样累积不同的实例。例如,我希望能够添加更多的数字到列表中,列表将保留所有元素。我希望能够使用列表来存储许多数字,而不仅仅是数字的一个实例。我通过在init下创建list和count的实例测试了您所述的方法,但是如果我在上一个add_new_arrival之后调用add_new_arrival,它会不断重置值,然后只创建一个存储。