Python中如何打印列表内对象的实际值而非内存地址?
问题解决:打印Grade对象列表显示内存地址而非分数值
问题原因
你遇到的问题出在两个关键点:
- 错误的
__str__实现:你写的__str__方法返回str(self.grades),但Grade实例并没有grades属性(该属性属于Student类),这个方法根本无法正确返回分数值。 - 列表打印的机制:当打印列表(比如
pieter.grades)时,Python会对列表中的每个元素调用__repr__方法而非__str__。即便__str__写对了,只要__repr__没有正确实现,列表仍会显示默认的对象内存地址。
解决方案
正确实现Grade类的__repr__方法,让它返回分数的字符串表示即可。如果需要单独打印Grade实例时也显示分数,可同时实现__str__(两者可复用逻辑)。
修正后的代码
class Student: def __init__(self, name, year): self.name = name self.year = year self.grades = [] def add_grade(self, grade): if isinstance(grade, Grade): self.grades.append(grade) roger = Student("Roger van der Weyden", 10) sandro = Student("Sandro Botticelli", 12) pieter = Student("Pieter Bruegel the Elder", 8) class Grade: minimum_passing = 65 def __init__(self, score): self.score = score def is_passing(self): if self.score >= self.minimum_passing: print("Passing") else: print("Failing") def __repr__(self): # 返回分数的字符串形式,让列表打印时直接显示分数 return str(self.score) # 可选:实现__str__,单独打印Grade实例时也显示分数 def __str__(self): return str(self.score) pieter.add_grade(Grade(100)) pieter.add_grade(Grade(89)) pieter_result = Grade(55) pieter_result.is_passing() print(pieter.grades) # 现在会输出 [100, 89]
额外说明
isinstance(grade, Grade)比type(grade) is Grade更灵活,支持继承场景,你的这个修改是正确的。- 如果只需要列表打印显示分数,仅实现
__repr__就足够;如果需要单独打印Grade实例(比如print(Grade(100)))也显示分数,再加上__str__方法即可。
内容的提问来源于stack exchange,提问作者Goodman Saul
相关产品推荐
相关产品推荐

