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!
考虑:
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 字符串中显示的内容?
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!