本文已参与「新人创作礼」活动,一起开启掘金创作之路。
引言
当我们python中定义一个类时,常用__str__以及__repr__函数输出这个类的具体描述,但这两个函数具体又有些什么区别呢?一句话总结的话:__repr__比__str__的使用要求更加严格,优先级更低。
优先级比较
首先__repr__和__str__在判定优先级上有所区别,当我们在类中同时定义__repr__和__str__方法时,并不会先后输出对应内容,而是有选择性的输出其中一个,验证如下:
class My_func (object):
def __init__(self,name):
self.name=name
def __str__(self):
print("这是一个__str__函数")
return self.name
def __repr__(self):
print("这是一个__repr__函数")
return self.name
def main():
fun=My_func('doge')
print(fun)
if __name__=='__main__':
main()
运行结果:
这是一个__str__函数
doge
从上面可以看出,当使用print()输出类的描述时,会优先寻找__str__函数的解释,覆盖掉__repq__的描述,即__str__的优先级要高于__repq__。
使用要求比较
__repr__和__str__除了在优先级上,还在使用要求上有所区分。
无str
class My_func (object):
def __init__(self,name):
self.name=name
def __repr__(self):
print("这是一个__repr__函数")
return self.name
def main():
fun=My_func('doge')
print(str(fun))
if __name__=='__main__':
main()
运行结果:
这是一个__repr__函数
doge
如上所示,当类方法中没有定义__str__时,调用str()函数并不会输出默认的地址值,而是会调用存在的__repr__函数。
无repr
class My_func (object):
def __init__(self,name):
self.name=name
def __str__(self):
print("这是一个__str__函数")
return self.name
def main():
fun=My_func('doge')
print(repr(fun))
if __name__=='__main__':
main()
结果:
<__main__.My_func object at 0x000001F1E4072518>
当类中并没有定义__repr__时,不会再调用__str__,而是会直接输出默认值即内存中的地址。从而可以看出实际使用时__repr__会作为__str__的下位替代,若类中不包含__str__方法,则会使用__repr__作为替代,反之则不会发生。
另:这两个函数的return值都应该是字符,不能return一个整型或其他值。