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__方法的目标不是像本例那样返回一个纯字符串,而是一个可用于重新创建对象的表示。


以上是Python预定义的__str__方法行为异常的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>