Python是我学习的第一种语言,目前我正在研究用于存储简单数据的文件输入/输出系统。我做了一个关于简单写作和酸洗的练习。出于我的目的,我想使用简单的写作,因为我想编辑我的“保存文件”。在
当数据是字符串时,我成功地存储和检索数据。问题是,当我存储对象时,它将其存储为不可读的格式:
<__main__.Character object at 0x0078FE10>
我怎样才能把上面这个不可读的格式返回到我的对象中呢?Python是否有一个内置函数可以实现这一点?在
或者,在写入数据文件之前,我是否必须将对象转换为包含所有重要变量的字符串?在
编辑:哦,忘了代码!
^{pr2}$这是I/O系统的读取部分。您可以看到它读取数据>;将字符串转换为列表>;拆分列表中的参数>;使用参数创建对象。在
with open('charData', 'r') as data:
data = data.read() # Read the contents of the file into memory.
print (data)
my_list = data.splitlines()
print (my_list[0]) # Print the list.
char_data = ast.literal_eval(my_list[0])
new_character = Character(*char_data)
然后我有自己的函数来显示对象统计信息:
new_character.stats()
吐出
Harley is level 3
with 10 health
正如你所见,它很好用。但如果我用新建文件.write(new_character)”它本质上是对象的字符串,从上面看是“<;main.character object at 0x0215FE10>;”。在
在过去的一个小时里,我一直在这个对象中使用str,但还没有找到一种方法来使用该函数来找到解决方案,并从更有经验的人那里寻求指导。在
编辑Matt Habel:
def __str__(self):
print ("[\"", end="")
print (self.name, end="")
print ("\"", end=", ")
print (self.exp, end="")
print (",", end=" ")
print (self.atk, end="")
print ("]")
这将输出:
["Harley", 300, 3]
print(new_character)
TypeError: __str__ returned non-string (type NoneType)
我制作自己的“list”的理由是,我可以使用“AST”模块来定义list参数。我稍后会将上面的列表转换为“new_character2”,并使用以下方法编写:
newFile = open("charData","w")
newFile.write(new_character2)
立即使用:
我使用return函数,而不是上面复杂的解析。在
def export(self):
self.name = str(self.name)
self.exp = str(self.exp)
self.atk = str(self.atk)
matt_data = "[\"%s\", %s, %s]" % (self.name, self.exp, self.atk)
return matt_data
matt_export = new_character.export()
print(matt_export)
吐出:
["Harley", 600, 3]
而且没有错误代码!在
要保存对象,必须对其进行序列化。根据您使用的是python2.7.x还是3.x,您有不同的特定选项,但下面是pickle docs的版本,它将对2.7.x有所帮助。在
这种格式是python提供给对象的默认字符串表示。您可以通过在一个类的实例上调用^{} 来检查这一点。如果需要对象的可读字符串,可以在类上提供自定义的
__str__(self)
方法。这将更改输出到文件的对象字符串表示形式。在至于你的实际问题是如何将默认表示转换回你的对象之一:这是不可能的。这是因为默认表示只告诉你对象的名称和它当前存储的内存位置。因为内存是暂时的(在运行它的不同时间对程序是不可用的),所以不能将内存地址转换回对象之一。在
如果你想这样做,有几种方法可以做到:
__str__
方法。这将输出您可以读取的数据,并希望它可以很容易地解析回一个对象。您必须从文件中读取对象的字符串表示,提取创建新对象所需的数据,然后创建对象。在相关问题 更多 >
编程相关推荐