个性化阅读
专注于IT技术分析

Python中__str__和__repr__有什么区别?分别有什么作用?

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”)。

__str__的目标是可读的

具体来说,它并不是明确的 – 请注意str(3)== str(“3”)。同样,如果你实现了一个IP抽象,它的str看起来像192.168.1.1就好了。在实现日期/时间抽象时,str可以是“2010/4/12 15:35:22”等。目标是以用户而不是程序员想要读取它的方式来表示它。砍掉无用的数字,假装是其他类 – 只要它支持可读性,它就是一种改进。

Container的__str__使用包含的对象’__repr__

这似乎令人惊讶,不是吗?它有点,但可读性如何

总结

为你实现的任何类实现__repr__,如果你认为在可读性方面存在错误的字符串版本会很有用,请实现__str__。

赞(0)
未经允许不得转载:srcmini » Python中__str__和__repr__有什么区别?分别有什么作用?

评论 抢沙发

评论前必须登录!