【问题标题】:Python - list reset on program exit, how to store objects in list to access later?Python - 程序退出时列表重置,如何将对象存储在列表中以供以后访问?
【发布时间】:2014-11-25 16:00:58
【问题描述】:

我是 python 新手,试图用简单的登录系统编写一个非常简单的游戏,以便以后保存进度。

我正在做用户对象登录并存储在列表中,但程序退出时列表为空,这是我写的

class Users(object):


    users = []

    def __init__(self, username=None, password=None):

        global users #recommended from comment on this website other topic

        self.username = username
        self.password = password

#print Users.users[0].username    #was using to check if object saved to list
#print Users.users[0].password

print "L to login, R to register, Q to quit"
answer = raw_input("> ")
if answer == "r":
    username_r = raw_input("Create name: ")
    for user in Users.users:
        if username_r in user.username:
    #if any (self.username == username_r for Users in Users.users):
            print "Name already exists"
    password_r = raw_input("Create password: ")


    u = Users(username_r, password_r)
    Users.users.insert(len(Users.users), u)

    print "\n------------------\n"
    print Users.users[0].username #appends correctly
    print Users.users[0].password

我已经尝试并从网站上读取了其他代码,但它不会永久存储在列表中以供以后访问。

此代码仅用于游戏介绍,用户打开后需要登录或注册才能开始。

使用notepad++和powershell,非常感谢任何帮助,谢谢。

【问题讨论】:

  • pickle 模块提供数据持久性,或者shelve 模块在底层使用pickle,但使用类似于字典的语法。否则,请考虑将信息存储在数据库或其他中间格式(json、xml 等)中。
  • 你在哪里看到global在课堂上的使用?
  • 我不相信它与 Python 中 pickle 的常见用例重复,因为这种情况可能使用另一种存储机制。

标签: python


【解决方案1】:

我会使用Pickle:

泡菜模块实现了基本的,但强大的算法 序列化和解除序列化Python对象结构。 “酸洗” 是Python对象层次结构转换为a的过程 字节流,“解压缩”是逆操作,由此一个字节 流被转换回对象层次结构。酸洗(和 unpickling)或者被称为“序列化”,“编组”, 或者“平坦化”,以避免混淆,这里使用的术语是 “酸洗”和“解密”。

以下是您的类用户的示例:
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> class Users(object):
...     users = []
...     def __init__(self, username=None, password=None):
...         global users
...         self.username = username
...         self.password = password
... 
>>> import pickle
>>> luke = Users('Luke', 'Skywalker')
>>> messi = Users('Lionel', 'Messi')
>>> 
>>> myusers = [luke, messi]
>>> 
>>> pickle.dump( myusers, open("myusers.p", "wb"))
>>>

所以,上面我定义了类用户,我做了两个实例,最后我存储了一个名为myusers.p的文件里面的对象。最后一步被调用为序列化。

恢复您要做的:

$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> class Users(object):
...     users = []
...     def __init__(self, username=None, password=None):
...         global users
...         self.username = username
...         self.password = password
... 
>>> import pickle
>>> myusers = pickle.load( open( "myusers.p", "rb" ) )
>>> myusers
[<__main__.Users object at 0x7fe4cecfc350>, 
 <__main__.Users object at 0x7fe4cecfc390>]
>>> myusers[0].username
'Luke'
>>> myusers[1].username
'Lionel'
>>> 

请注意,在恢复对象之前,必须在当前范围内定义类用户。

如果您需要在此方法中进一步进一步使用ZODB,a @ 987654323或SQL数据库。

使用像泡菜或Zodb这样的纯对象存储机制的好东西,你是否只用一个范例,对象处理。但在关系数据库中,您可能需要使用对象关系映射器(ORM)添加一点复杂性,但如果您需要存储大量数据并执行大量查询是最佳方式之一。 Python有很多ORMs

【讨论】:

  • cool!现在我知道泡菜,我使用了,它工作但只有一个用户对象,如果另一个用户稍后寄存在它替换第一个用户,即它不会超越索引0 span>
  • 该示例只是展示了如何使用泡菜。根据您的评论,我建议您查看List如何在Python中使用,特别是Append方法。它也可能是有用的词典而不是列表。 span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2020-09-21
相关资源
最近更新 更多