Python中current_question为何被识别为类对象而非字符串
Python问答测验项目
current_question类型问题解答 核心逻辑说明
Python是动态类型语言,变量本身没有固定类型,赋值时传入什么类型的值,变量就是什么类型。参考代码中current_question成为Question类实例没有特殊逻辑,完全由列表存储的元素类型决定,完整传递链路如下:
- 入口文件
main.py构建题库列表question_bank时,会遍历原始字典格式的题目数据question_data,对每一道题执行new_question = Question(question_text, question_answer),创建Question类的实例对象,再把这个实例追加到question_bank中 - 初始化
QuizBrain实例时,存满Question实例的question_bank被传入,赋值给类属性self.question_list - 调用
next_question方法时,执行current_question = self.question_list[self.question_number],从self.question_list中按索引取出的元素本身就是之前存入的Question实例,因此current_question会被识别为类对象,可以直接访问.text(题目文本)和.answer(正确答案)属性。
自行实现时current_question为字符串的常见原因
出现这个问题的本质是self.question_list里存储的元素不是Question类实例,通常是以下几种写法错误导致的:
- 构建
question_bank时跳过了创建Question实例的步骤,直接把从question_data中取出的题目文本字符串追加到了列表中 - 初始化
QuizBrain时传入的参数不是构造好的question_bank,而是原始的question_data字典列表,甚至直接传入了题目文本组成的字符串列表 - 在
next_question方法中取值时多做了一层字符串提取,比如写成current_question = self.question_list[self.question_number]["question"],直接拿到了题目文本字符串,自然无法访问类实例的属性。
快速排查方式
- 在初始化
quiz对象后添加打印语句print(type(quiz.question_list[0])),如果输出结果不是<class 'question_model.Question'>,即可确认题库列表构造环节没有正确存入类实例 - 逐行检查
question_bank的循环构造逻辑,确认每次append到列表中的值是Question()构造返回的实例对象,而非字符串、字典等其他类型数据。
内容的提问来源于stack exchange,提问作者DadTryingToCode
相关产品推荐
相关产品推荐

