Python中__str__和__repr__有什么区别?分别有什么作用?
默认实现是无用的(很难想到一个不会,但是是的)
__repr__目标是明确的
__str__目标是可读的
Container的__str__使用包含的对象’
__repr__
默认实现是无用的
这让人有点惊讶,因为Python的默认值往往非常有用。
但是,在这种情况下,具有__repr__的默认值,其行为如下:
return "%s(%r)" % (self.__class__, self.__dict__)
本来就不安全了(例如,如果对象相互引用,太容易进入无限递归)。所以Python警察出来了。请注意,有一个默认值为true:如果定义了__repr__,而__str__未定义,则该对象的行为就像__str __ = __ repr__。
这意味着,简单来说:你实现的几乎每个对象都应该具有可用于理解对象的函数__repr__。实现__str__是可选的:如果你需要“漂亮的打印”功能(例如,由报告生成器使用),请执行此操作。
__repr__的目标是明确的
让我直接说出来 – 我不相信调试器。我真的不知道如何使用任何调试器,并且从未认真使用过。此外,我认为调试器的大错是它们的基本性质 – 我调试的大多数失败发生在很久很久以前,在一个遥远的星系中。这意味着我确实相信,在宗教热情的情况下,伐木。记录是任何体面的即发即弃服务器系统的生命线。 Python可以很容易地记录:可能有一些项目特定的包装器,你需要的只是一个
log(INFO, "I am in the weird function and a is", a, "and b is", b, "but I got a null C — using default", default_c)
但是你必须做最后一步 – 确保你实现的每个对象都有一个有用的repr,所以这样的代码可以正常工作。这就是“eval”事情出现的原因:如果你有足够的信息,那么eval(repr(c))== c,这意味着你知道有关c的所有信息。如果这很容易,至少以模糊的方式,做到这一点。如果没有,请确保你有足够的c信息。我通常使用类似eval的格式:“MyClass(this =%r,that =%r)”%(self.this,self.that)。这并不意味着你可以实际构造MyClass,或者那些是正确的构造函数参数 – 但它是一种有用的形式来表达“这是你需要了解的关于这个实例的一切”。
注意:我上面使用的是%r,而不是%s。你总是希望在__repr__实现中使用repr()[或%r格式化字符,或者你正在击败repr的目标。你希望能够区分MyClass(3)和MyClass(“3”)。
【Python中__str__和__repr__有什么区别(分别有什么作用?)】__str__的目标是可读的
具体来说,它并不是明确的 – 请注意str(3)== str(“3”)。同样,如果你实现了一个IP抽象,它的str看起来像192.168.1.1就好了。在实现日期/时间抽象时,str可以是“2010/4/12 15:35:22”等。目标是以用户而不是程序员想要读取它的方式来表示它。砍掉无用的数字,假装是其他类 – 只要它支持可读性,它就是一种改进。
Container的__str__使用包含的对象’ __repr__
这似乎令人惊讶,不是吗?它有点,但可读性如何
总结
为你实现的任何类实现__repr__,如果你认为在可读性方面存在错误的字符串版本会很有用,请实现__str__。
推荐阅读
- Python如何创建功能装饰器链(有相关实例吗?)
- Python中的元类是什么(如何理解?有什么作用?如何使用元类?)
- Python如何将两个字典合并到一个表达式中(有哪些方式?)
- 如何按照值对Python字典排序(有几种方式和对应的实例?)
- 如何理解Python中if__name__==“__main__”(它是什么意思,有什么用?)
- CD Projekt Red承诺《赛博朋克2077》的发展紧缩不会像《巫师3》那样糟糕
- Blair Witch赶在万圣节前夕获得新的VR体验
- Ubisoft承诺《善与恶2》之外的更新承诺“游戏进展顺利”
- Anthems的残局仍然需要证明自己