Python - 在程序退出时重置列表,如何在列表中存储对象以便以后访问?

时间:2014-09-30 21:53:28

标签: python

我是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,非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

我会使用Pickle

  

pickle模块实现了一个基本但强大的算法   序列化和反序列化Python对象结构。 “酸洗”   是将Python对象层次结构转换为a的过程   字节流和“unpickling”是反向操作,由此是一个字节   流被转换回对象层次结构。酸洗(和   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"))
>>>

所以,上面我定义了类Users,我创建了两个实例,最后我将这些对象存储在一个名为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'
>>> 

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

如果您需要进一步采用此方法,可以考虑使用ZODBnosql database或sql数据库。

使用像pickle或zodb这样的纯对象存储机制的一个好处是你只处理一个范例对象。但是在关系数据库中,您可能需要使用对象关系映射器(ORM),这会增加一些复杂性,但如果您需要存储大量数据并执行大量查询,那么这是最好的方法之一。 Python中有很多ORMs