
当Python对象未定义字符串表示方法时,直接打印会输出内存地址;本文详解两种解决方案:修改调用方式或为类添加__str__方法,确保Quiz程序正确显示题目内容。
当python对象未定义字符串表示方法时,直接打印会输出内存地址;本文详解两种解决方案:修改调用方式或为类添加`__str__`方法,确保quiz程序正确显示题目内容。
在开发基于面向对象的测验程序(如Quiz Brain)时,一个常见却易被忽视的问题是:终端输出显示的是类似
根本原因在于:Question 类实例本身不具备自然可读的字符串形式,而 input() 函数中直接使用 current_question(即 Question 对象)参与格式化字符串,触发了其默认 __repr__ 行为,从而打印出内存地址。
✅ 解决方案一:显式访问属性(推荐初学者采用)
在 QuizBrain.next_question() 方法中,将 current_question 替换为 current_question.text,明确提取题目文本:
def next_question(self):
current_question = self.question_list[self.question_number]
self.question_number += 1
# ✅ 正确:访问 Question 实例的 text 属性
user_answer = input(f"{self.question_number}: {current_question.text} (True/False): ")
此方式直观、可控,无需修改 Question 类,适合调试和教学场景。
✅ 解决方案二:增强类的字符串协议(更优雅的工程实践)
为 Question 类添加 __str__ 方法,使其“自然可打印”:
class Question:
def __init__(self, text, answer):
self.text = text
self.answer = answer
def __str__(self):
return self.text # ✅ 定义对象的友好字符串表示
添加后,所有涉及 print(current_question) 或 f"{current_question}" 的场景均自动输出题目文本,代码更简洁,且符合Python的鸭子类型与协议设计思想。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
⚠️ 注意事项
- 不要混淆 __str__ 与 __repr__:__str__ 面向用户,应简洁可读;__repr__ 面向开发者,建议返回可重建对象的表达式(如 Question('Is Earth round?', 'True'))。
- 若同时定义两者,print() 和 str() 调用 __str__,而交互式环境或 repr() 显式调用 __repr__。
- 确保 question_data 中每个字典确实包含 "text" 和 "answer" 键,避免 KeyError。
通过任一方案,你的测验程序将正确显示题目,例如:
1: A slug's blood is green (True/False): True 2: The loudest animal is the African Elephant (True/False): False
掌握对象字符串化机制,不仅能解决当前问题,更是深入理解Python数据模型的关键一步。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










