当前位置: 首页 > 面试题库 >

Python-__str__和__repr__之间的区别?

贺经纶
2023-03-14
问题内容

__str____repr__有什么不一样?


问题答案:
  • 默认的实现是无用的(很难想象有一个不是,但是是的)
  • __repr__ 目标是明确
  • __str__目标是可读性
  • 容器的__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)

但是,你必须做最后一步-确保实现的每个对象都有一个有用的代表,这样的代码才能正常工作。这就是为什么出现“评估”问题的原因:如果你有足够的信息eval(repr(c))==c,这意味着你知道所有要了解的信息c。如果那很容易(至少以一种模糊的方式),那就去做。如果不是,请确保你有足够的信息c。我通常使用类似eval的格式:"MyClass(this=%r,that=%r)" % (self.this,self.that)。这并不意味着你可以实际构造MyClass,也不意味着它们是正确的构造函数参数—但这是表达“这是你需要了解的所有实例”的有用形式。

注意:我在%r上面使用过,不是%s。你总是想在实现中使用repr()[或%r等效地格式化字符] __repr__,否则你就无法实现repr的目标。你要能够区分MyClass(3)MyClass("3")

str的目标是可读性

具体来说,它并非旨在明确-请注意str(3)==str(“3”)。同样,如果实现IP抽象,则让其str看起来像192.168.1.1很好。在实现日期/时间抽象时,str可以是“ 2010/4/12 15:35:22”,等等。目标是以用户(而不是程序员)希望阅读的方式表示它。砍掉无用的数字,冒充其他类别-只要它支持可读性,它就是一种进步。

容器的__str__用途包含对象__repr__

这似乎令人惊讶,不是吗?有点,但是如果使用它们,它们的可读性如何__str__

[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]

不是特别的。具体而言,容器中的字符串会发现太容易打乱其字符串表示形式。记住,面对歧义,Python抵制了猜测的诱惑。如果你在打印列表时需要上述行为,则只需

print "[" + ", ".join(l) + "]"

(你可能还可以弄清楚如何处理字典。

摘要

实现__repr__你实现任何类。这应该是第二天性。实现__str__,如果你认为这将是具有犯错可读性侧面的字符串版本是有用的。



 类似资料:
  • 本文向大家介绍Python 的 __str__ 和 __repr__ 方法对比,包括了Python 的 __str__ 和 __repr__ 方法对比的使用技巧和注意事项,需要的朋友参考一下 阅读到 Strings 中关于转换对象为字符串的内容,介绍了 repr 函数,趁着还没有真正了解 Python 面向对象的生疏与热度,感性上理解一下 repr 与 str 这两个函数的区别。 Python 的

  • rank ▲ ✰ vote url 20 707 342 931 url __str__和repr__的区别 __str__和repr__有什么区别? 首先让我们梳理一下张三的答案: 用起来没有什么区别 __repr__的目的是明确的 __str__的目的是可读性 __str__的用法包含__repr__ 用法没有什么区别 因为Python的宗旨是易用的,所以这看起来有点不寻常.但是当

  • 本文向大家介绍C和Python之间的区别,包括了C和Python之间的区别的使用技巧和注意事项,需要的朋友参考一下 C和Python都是主要使用的编程语言。各种特性使它们在程序设计领域流行。根据这些特征,我们可以区分C和Python。 以下是C和Python之间的重要区别。 序号 键 C语言 Python语言 定义 Python是一种通用的解释型,交互式,面向对象的高级编程语言。 类型 另一方面,

  • 本文向大家介绍Python和Bash之间的区别,包括了Python和Bash之间的区别的使用技巧和注意事项,需要的朋友参考一下 Python Python是一种编程语言,旨在易于实现和易于理解。它是一种动态类型的语言。它不使用指针。 重击 Bash是命令行解释器,默认情况下在Linux和MacOS操作系统中提供。它也可以安装在其他操作系统中。它是Linux和MacOS的默认用户外壳程序。 以下是P

  • 前面章节中,我们经常会直接输出类的实例化对象,例如: 程序运行结果为: <__main__.CLanguage object at 0x000001A7275221D0> 通常情况下,直接输出某个实例化对象,本意往往是想了解该对象的基本信息,例如该对象有哪些属性,它们的值各是多少等等。但默认情况下,我们得到的信息只会是“类名+object at+内存地址”,对我们了解该实例化对象帮助不大。 那么,