为何dataclass优先__repr__而非__str__?如何让Bar用Foo的__str__?
Python Dataclass中__repr__与__str__的疑问解答
1. 为什么dataclass优先使用__repr__而非__str__?
Python的dataclass默认会自动生成__repr__方法,这个方法的设计目标是生成能准确反映对象结构、可用于调试或重现对象的字符串。当你直接print(b)时,因为Bar类没有自定义__str__方法,Python会 fallback 到调用__repr__(这是object类的默认行为:如果没有__str__,就用__repr__替代)。而dataclass生成的__repr__在拼接字段字符串时,会调用每个字段对象的__repr__方法,而非__str__,这就是输出(B)中显示Foo::__repr__的原因。
2. 能否不为Bar定义__str__的前提下,让Bar使用Foo的__str__?
不行。因为Bar的默认输出逻辑是:没有自定义__str__时,调用dataclass生成的__repr__,而这个__repr__固定使用字段的__repr__来构建字符串。如果想要print(b)时显示Foo的__str__内容,必须为Bar自定义__str__方法,比如:
@dataclass() class Bar(): foo: Foo def __str__(self) -> str: return f"Bar(foo={str(self.foo)})"
3. 移除Foo的__repr__后,输出(B)仍为Bar(foo=Foo())而非Bar(foo=Foo::str)的原因?
因为Foo是dataclass,即使你移除了自定义的__repr__,dataclass会自动为它生成一个默认的__repr__方法。由于Foo没有定义任何字段,默认生成的__repr__就是Foo()。而Bar的__repr__依然会调用Foo的__repr__(而非__str__),所以最终输出是Bar(foo=Foo())。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

