f-string 使用什么方法来显示 class 的实例?

What method does f-string use to display an instance of a class?

考虑:

class Base:
    def __init__(self):
        self.__repr__ = lambda: "String!"

class Child(Base):
    pass

c = Child()
print(f"{c}")
print(f"{c.__repr__()}")

这导致:

<__main__.Child object at 0x7f07cd88f850>
String!

我在更改 __str____format__ 方法时得到相同的输出。我希望 Child 在 f 字符串中的表示只是 "String!",但更改 __str____repr____format__ 无法实现这个。

如果不是实例的 __repr__ 或其他两种方法之一,Python 使用什么来确定 f 字符串中显示的内容?

在对象的 类型 ,而不是对象本身(参见:Special method lookup),并且做类似 self.__repr__ = lambda: "String!" 的事情会改变 实例 的字典(不是 class 本身)。在上面的示例中,c.__dict__ 结果为:

{'__repr__': <function Base.__init__.<locals>.<lambda> at 0x7f07cd81de10>}

也就是说,我们已经将实例的字典更改为包含__repr__,但实际上并没有更改实例的特殊功能(查找在 class 本身上,而不是所述 class 的任何单独实例)。因此,当实例在 f-string 上表示时,使用特殊函数 。正确的做法应该是:

class Base:
    def __repr__(self):
        return "String!"


class Child(Base):
    pass

c = Child()
print(f"{c}")

输出:

String!