当前位置: 首页 > 后端技术 > Python

这篇文章让你全面了解Python中__str__和__repr__的异同?

时间:2023-03-26 19:13:33 Python

__str__和__repr__?我们都知道字符串的表示。以我们易于识别的形式表达。这就是“字符串表示”。repr()是通过特殊的方法__repr__得到一个对象的字符串表示。如果未实现__repr__,当我们向控制台打印一个向量实例时,我们得到的字符串可能是。>>>classExample:pass>>>print(str(Example()))<__main__.Exampleobjectat0x10a514f98>>>>print(repr(Example()))<__main__.Exampleobjectat0x1088eb438>>>>>>>str(Example)"">>>repr(Example())'<__main__.Exampleobjectat0x1088eb438>'__str__vs.__repr__接下来我们看看__str__和__repr__有什么相似之处和__repr__的差异。根据官方Python文档定义:__str__:由str(object)和内置函数format()和print()调用,以生成对象的“非正式”或格式良好的字符串表示形式。返回值必须是字符串对象。__repr__:由repr()内置函数调用以输出对象的“官方”字符串表示形式。返回值必须是字符串对象,该方法通常用于调试。内置类型对象定义的默认实现调用object.__repr__()。什么正式和非正式格式,你有没有混淆过?没关系,我们继续看:1、都可以输出对象>>>x=4>>>repr(x)'4'>>>str(x)'4'>>>y='pythonic'>>>repr(y)"'pythonic'">>>str(y)'pythonic'>>>z='4'>>>repr(z)"'4'">>>str(z)#注意,这里的输出形式和str(x)一样,只是x和z的类型不同'4'>>>str(x)==str(z)True>>>repr(x)==repr(z)False>>>str(4)==str("4")True>>>repr(4)==repr("4")False当x=4时,当x为整数类型时,调用str()和repr()返回相同的结果,当y是字符串类型时,repr(y)的结果是“官方”字符串表示,而str(y)的结果是“非正式”。str()可以让我们最快的理解对象的内容,具有很高的可读性。2.__str__可读,__repr__目标明确>>>importdatetime>>>d=datetime.datetime.now()>>>str(d)'2020-04-0420:47:46.525245'>>>repr(d)'datetime.datetime(2020,4,4,20,47,46,525245)'>>>可以看出repr()可以更好的显示对象的类型、值等信息,对象描述清楚。在使用str()函数时调用,或者用print函数打印对象时调用,它返回的字符串对最终用户更友好。3.重写__repr__,它也将使用__str_classStudent():def__init__(self,name):self.name=namedef__str__(self):return"Name:"+self.namedef__repr__(self):return"Name:"+self.nameclass_one=Student("Alice")print(class_one)print(str(class_one))print(repr(class_one))输出结果:Name:AliceName:Alicename:Alice总结共同点:都用到了输出一个对象的区别:__str__旨在人类可读,__str__()不期望返回有效的Python表达式,但可能使用更方便或更准确的描述信息。__repr__的目标是明确的,返回的字符串应该是准确的、没有歧义的,并尽可能表达如何使用代码来创建打印对象。使用容器的__str__方法包含对象的__repr__参考:《Python中__str__和__repr__的区别》FluentPython