当前位置: 首页 > 科技观察

彻底理解Python中__str__和__repr__

时间:2023-03-19 19:46:35 科技观察

__str__和__repr__的异同?我们都知道字符串的表示。Python的内置函数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__**之间的相同点和不同点。根据官方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)的结果是“非正式””of.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()可以更好的显示类型,v对象的alue等信息,对象描述清楚。在使用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总结共同点:Both用于输出一个对象区别:__str__的目标是可读性,__str__()不期望返回有效的Python表达式,而是可以使用更方便或更准确的描述信息。__repr__的目标是明确的,返回的字符串应该是准确的、没有歧义的,并尽可能表达如何用代码创建打印对象。使用容器的__str__方法包含对象的__repr__