簡體   English   中英

Python-程序退出時重置列表,如何將對象存儲在列表中以供以后訪問?

[英]Python - list reset on program exit, how to store objects in list to access later?

我是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

pickle模塊實現了一個基本但功能強大的算法,用於對Python對象結構進行序列化和反序列化。 “ Pickling”是將Python對象層次結構轉換為字節流的過程,而“ 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'
>>> 

請注意,在還原對象之前,必須在當前作用域中定義用戶類。

如果需要進一步采用這種方法,則可以考慮使用ZODBnosql數據庫或sql數據庫。

使用像pickle或zodb這樣的純對象存儲機制的一件好事是,您只處理一種范式,即對象。 但是在關系數據庫中,您可能需要使用對象關系映射器(ORM),這會增加一些復雜性,但是如果需要存儲大量數據並執行大量查詢,則這是最好的方法之一。 Python中有很多ORM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM