Python出现'QuizBrain'对象无user_r属性的AttributeError报错求解
报错根因
你碰到的AttributeError和是否在__init__中声明user_r没有直接关系,本质是属性的调用时机早于创建时机:
- Python语法本身允许在类的任意实例方法中给
self绑定新属性,不强制要求所有属性必须在__init__中提前定义 - 你的代码运行后,while循环的判断条件会优先执行
quiz_brain.check_answer(),此时还没有调用过next_question()方法,self.user_r还没有被赋值创建,自然会报属性不存在的错误。
修复方案
首先调整循环的执行逻辑,先触发答题获取用户输入,再校验答案:
# 替换原有while循环部分代码 while quiz_brain.still_have_questions(): # 先出题获取用户输入,此时才会创建self.user_r属性 quiz_brain.next_question() # 再校验答案,答错直接退出 if not quiz_brain.check_answer(): break
另外你还存在隐藏的逻辑错误:next_question()中拿到用户输入后已经执行了self.current_number += 1,后续check_answer()中取self.answer_list[self.current_number]会拿到下一题的答案,甚至最后一题会触发索引越界,你可以调整数值递增的时机,或者在校验答案时用self.current_number - 1作为索引取值。
关于__init__声明属性的说明
- 语法层面没有强制要求必须在
__init__中声明所有属性,只要保证调用属性前,已经执行过self.xxx的赋值逻辑就可以正常运行 - 工程实践中更推荐在
__init__中提前声明所有实例属性,哪怕先赋值为None,既可以提升代码可读性,也能避免意外的属性未定义报错,比如你也可以在__init__中加一行self.user_r = None提前占位,也能解决本次报错,但这并没有解决你代码逻辑顺序错误的核心问题。
内容的提问来源于stack exchange,提问作者7223이시윤
相关产品推荐
相关产品推荐

