[英]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'
>>>
請注意,在還原對象之前,必須在當前作用域中定義用戶類。
如果需要進一步采用這種方法,則可以考慮使用ZODB , nosql數據庫或sql數據庫。
使用像pickle或zodb這樣的純對象存儲機制的一件好事是,您只處理一種范式,即對象。 但是在關系數據庫中,您可能需要使用對象關系映射器(ORM),這會增加一些復雜性,但是如果需要存儲大量數據並執行大量查詢,則這是最好的方法之一。 Python中有很多ORM 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.