Python预定义的__str__方法行为异常
下面是一个简单的 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在控制台中看到输出。一切都很好。
但是,如果我执行下面的代码片段,发生的事情是非常出乎意料的,它几乎让我确信我们生活在模拟中,没有什么是真实的。
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>].
这怎么可能?怎么可能呢?我是真的吗?你是真的吗?我只是不明白。如何?为什么?为什么?
回答
你的假设是list递归调用str其内容是错误的。list调用repr,这是通过魔术方法实现的__repr__:
>>> class Foo:
... def __init__(self, n):
... self.n = n
... def __repr__(self):
... return self.n
...
>>> [Foo('a'), Foo('b')]
[a, b]
>>> print(_)
[a, b]
然而,该__repr__方法的目标不是像本例那样返回一个纯字符串,而是一个可用于重新创建对象的表示。