Python中<__main__.Datos object at ...>输出含义及原因问询
为什么打印自定义类实例会输出
<__main__.Datos object at 0x00000259566AFE50>? 这个输出是Python对自定义类实例的默认字符串表示:因为你没有给Datos类定义__str__或__repr__方法,Python就会用内置的默认实现——输出类的完整路径(__main__.Datos表示当前脚本里的Datos类)加上实例在内存中的地址(0x00000259566AFE50)。
解决方法:给Datos类添加__str__方法
要让打印实例时显示有意义的内容,只需在Datos类中定义__str__方法,它会告诉Python如何把实例转换成可读性强的字符串:
class Datos: def __init__(self): self.indice = 0 # int()等价于0,直接写初始值更清晰 self.nombre = "" # str()等价于"" def __str__(self): # 返回自定义的显示格式 return f"山地索引: {self.indice}, 名称: {self.nombre}"
你的代码还有几个需要修正的问题
- 逻辑冗余:
循环条件已经是cad != "",里面的if cad == ''永远不会触发,可直接删除该判断。 - 数据覆盖问题:
每次循环都会覆盖datos的indice和nombre,最后只会保留文件最后一行的数据。如果要存储所有山地数据,应该用列表保存多个Datos实例。 - 异常捕获范围过宽:
直接except:会捕获所有异常,建议明确捕获FileNotFoundError这类文件相关异常,避免掩盖其他错误。
修改后的完整代码示例
class Datos: def __init__(self, indice=0, nombre=""): self.indice = indice self.nombre = nombre def __str__(self): return f"山地索引: {self.indice}, 名称: {self.nombre}" def GuardarMontaña(fich, datos_list): cad = fich.readline() ok = False while cad != "": cad_stripped = cad.strip() # 跳过空行 if not cad_stripped: cad = fich.readline() continue ok = True linea1 = cad_stripped.split() # 创建新实例并添加到列表 datos = Datos(int(linea1[0]), linea1[1]) datos_list.append(datos) cad = fich.readline() return ok def main(): try: f = open("Pr8_C_montanas.txt", encoding='UTF-8') except FileNotFoundError: print("找不到指定的文件。") except Exception as e: print(f"打开文件时出错: {e}") else: montanas = [] if GuardarMontaña(f, montanas): for montana in montanas: print(montana) else: print("无法读取有效数据。") finally: f.close() # 确保文件被关闭 if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者Alumna
相关产品推荐
相关产品推荐

