【发布时间】:2021-06-27 18:43:01
【问题描述】:
下面是一个简单的 Python 类的定义。
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
def __str__(self):
return self.name
如您所见,我们重写了__str__ 方法以返回学生的姓名。例如,如果我声明一个变量 x = Student("Trevor", 7) 并随后调用 print(x),我会在控制台中看到输出 Trevor。一切都很好。
但是,如果我执行下面的 sn-p,会发生出乎意料的事情,以至于它几乎让我相信我们生活在一个模拟中,没有什么是真实的。
s1 = Student("James", 11)
s2 = Student("Charlie", 8)
s3 = Student("Alice", 9)
s4 = Student("Dana", 12)
students = [s1, s2, s3, s4]
print(students)
我的 Java 大脑预计输出是 [James, Charlie, Alice, Dana],但我看到的是 [<__main__.Student object at 0x00A7E6D0>, <__main__.Student object at 0x00AFB310>, <__main__.Student object at 0x00AFBB68>, <__main__.Student object at 0x00AFBAD8>]。
这怎么可能?怎么可能?我是真的吗?你是真的吗?我只是不明白。如何?为什么?为什么?
【问题讨论】:
-
也许列表的
__str__方法没有在它的元素上调用__str__。但是,您可以手动执行此操作,它会起作用。 -
大多数容器类型(例如列表)的
__str__()是由其元素的__repr__()构建的,而不是它们的__str__()。您可以将__repr__ = __str__放在类定义的底部,以便对两者使用相同的方法。 -
...或者只定义
__repr__。__str__如果未定义将回退到它...
标签: python python-3.x