Python全局变量和类功能
我正在创建一个简单的python程序,它提供了SMS_收件箱的基本功能。我已经创建了一个SMS_收件箱方法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**
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,它会不断重置值,然后只创建一个存储。