You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:20:39