Python类实例调用getQuestion方法返回空行问题求助
问题分析与解决方案
核心问题
你遇到的空行输出,根源是Python的私有属性名称修饰机制:类中以双下划线开头的属性(如__question)会被解释器自动重命名为_类名__属性名(这里是_treasureChest__question)。你在readData中直接给arrayTreasure[i].__question赋值时,实际上是给对象新增了一个普通属性__question,而非修改类内部真正的私有属性。getQuestion()方法返回的始终是初始化时的空字符串,所以打印结果为空。
此外还有两个潜在问题:
- 文件中只有15行数据,对应5个宝箱(每个宝箱需要3行数据:问题、答案、分数),但你初始化了6个空宝箱,最后一个宝箱会读到空数据;
- 读取的答案和分数是字符串类型,但类设计中它们是整数类型,会导致后续
checkAnswer方法比较失效。
修复方案
方案一:添加Setter方法修改私有属性
给treasureChest类添加修改私有属性的方法,避免直接操作私有属性:
class treasureChest: def __init__(self, questionP, answerP, pointsP): self.__question = questionP self.__answer = answerP self.__points = pointsP def getQuestion(self): return self.__question # 添加Setter方法 def setQuestion(self, question): self.__question = question def setAnswer(self, answer): self.__answer = int(answer) def setPoints(self, points): self.__points = int(points) def checkAnswer(self, answer): return self.__answer == answer def getPoints(self, attempt): if attempt == 1: return self.__points elif attempt == 2: return self.__points // 2 elif attempt == 3 or attempt == 4: return self.__points // 4 else: return 0 arrayTreasure = [treasureChest("",0,0) for i in range(5)] # 改为5个,匹配文件数据量 def readData(): global arrayTreasure filename = "TreasureChestData.txt" try: with open(filename, "r") as file: # 使用with语句自动关闭文件 dataFetched = file.readline().strip() for i in range(len(arrayTreasure)): question = dataFetched answer = file.readline().strip() points = file.readline().strip() # 使用Setter方法修改属性 arrayTreasure[i].setQuestion(question) arrayTreasure[i].setAnswer(answer) arrayTreasure[i].setPoints(points) dataFetched = file.readline().strip() if (i < len(arrayTreasure)-1) else "" except FileNotFoundError: print("File could not be found") readData() print(arrayTreasure[1].getQuestion()) # 输出:100/10
方案二:读取数据时直接创建对象(更推荐)
不再提前初始化空宝箱列表,而是读取一行数据就创建一个treasureChest对象,避免私有属性修改问题:
class treasureChest: def __init__(self, questionP, answerP, pointsP): self.__question = questionP self.__answer = answerP self.__points = pointsP def getQuestion(self): return self.__question def checkAnswer(self, answer): return self.__answer == answer def getPoints(self, attempt): if attempt == 1: return self.__points elif attempt == 2: return self.__points // 2 elif attempt == 3 or attempt == 4: return self.__points // 4 else: return 0 arrayTreasure = [] def readData(): global arrayTreasure filename = "TreasureChestData.txt" try: with open(filename, "r") as file: while True: question = file.readline().strip() if not question: # 读到空行结束循环 break answer_line = file.readline().strip() points_line = file.readline().strip() if not answer_line or not points_line: # 防止最后一行数据不完整 break # 转换为整数类型 try: answer = int(answer_line) points = int(points_line) except ValueError: print(f"无效的数字格式:answer={answer_line}, points={points_line}") continue # 创建对象并添加到列表 chest = treasureChest(question, answer, points) arrayTreasure.append(chest) except FileNotFoundError: print("File could not be found") readData() if len(arrayTreasure) > 1: print(arrayTreasure[1].getQuestion()) # 输出:100/10 else: print("文件中数据不足")
验证结果
运行修改后的代码,arrayTreasure[1].getQuestion()会正确输出文件中第二组问题:100/10。
内容的提问来源于stack exchange,提问作者Muhammad Mujtaba Hussain
相关产品推荐
相关产品推荐

