Python 预定义的 __str__ 方法行为异常

标签 python python-3.x

<分区>

下面是一个简单的 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>] .

这怎么可能?怎么可能呢?我是真的吗?你是真的吗?我只是不明白。如何?为什么?为什么?

最佳答案

你的假设 that list recursively calls str on its elements is wrong . 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__ 方法行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66893132/

相关文章:

python-3.x - 机器学习中如何处理不同维度的特征向量?

python - 在 Python@3.10 上安装 cytoolz 时出现问题

python-3.x - 为什么当我尝试创建自定义命令行选项时 pytest 给我一个 "unrecognized option"错误?

python - 为什么 Python 数据类型在 Python 提示符中表现得像这样?

python - 加载多个文件并将它们保存为变量

python - 鼠标卡在不同的选择模式pycharm

python - OpenPose:体系结构x86_64的 undefined symbol :libcaffeproto.a(caffe.pb.cc.o)

python - BeautifulSoup4 无法正常工作,即使我已经使用 pip Linux Mint Sarah 成功安装了它

python - 使用 int|abs 时 Ansible Jinja 错误

python - 为什么 Pandas 数据框中按日期分组如此慢?