python的魔法方法类似于C++中的重载,在python中采用双下划线包围函数名的方法来实现对已有函数的重写,实现开发者想要的功能。python的魔法方法很多,这里直接可以参考https://fishc.com.cn/thread-48793-1-2.html总结的非常全面,这里不一一介绍。这篇博客主要是记录我学习过程遇到的问题,在这里总结一下__str__
和__repr__
两者的区别和联系。
问题的由来
直接上一个例子,由下图可以看到,当我们想打印一个类时,只能看到类名+object at+地址
的形式,当我们想查看类的属性时,当然也可以使用print(my_pool.length,my_pool.width)
的形式来实现,但是在python中有更好的方法来实现,即采用魔法方法__str__
和__repr__
__str__
方法
我们在上面类的基础上添加一个__str__
方法,可以看到,当重新打印类时,就是开发者想要的输出结果,当然,如果想要将类转换成字符串时,也可以直接调用str()
来实现,同样format()
也适用。
__repr__
方法
要想实现上面的功能,同样也可以使重写repr方法,在之前基础上,添加了一些调用信息可以更好的知道在使用那些语句时调用的什么方法。
__str__
和__repr__
的区别
通过上面的例子其实可以初步看出这两者的功能都是用来实现类到字符串的转换,但是两者还是存在区别,下面再用一个例子来说明其区别
从上述结果可以看出:
__str__
的返回结果可读性强,也就是便于读者理解
__repr__
的返回结果更加准确,便于开发者调试
总结
- 我们可以使用
__str__
和__repr__
方法定义类到字符串的转化方式,而不需要手动打印某些属性或是添加额外的方法。 - 一般来说,
__str__
的返回结果在于强可读性,而__repr__
的返回结果在于准确性。 - 我们至少需要添加一个
__repr__
方法来保证类到字符串的自定义转化的有效性,__repr__
是可选的。因为默认情况下,在需要却找不到__str__
方法的时候,会自动调用__repr__
方法。
参考链接:https://baijiahao.baidu.com/s?id=1596817611604972751&wfr=spider&for=pc