前言

Python中​​__repr__​​​和​​__str__​​使用区别

​__repr__​​ 使用

很多时候我们在创建一个类的时候,在终端打印类的实例,看到的是一个类似于这样的内容:​​<XXX object at 0x0000000001222E10> ​

class MyDefined(object):      def __init__(self):         self.name = "yoyo" 

在终端调试结果

>python Python 3.6.6 >>> from a import MyDefined >>> yo=MyDefined() >>> yo <a.MyDefined object at 0x0000015EEEB1F0B8> >>> 

返回的是对象的内存地址,对于初学者看起来很不友善,初学者无法理解返回的内容,于是可以加一个​​__repr__​​ 方法

class MyDefined(object):      def __init__(self):         self.name = "yoyo"      def __repr__(self):         return '<object MyDefined: {}>'.format(self.name) 

重新在终端调试

>python Python 3.6.6  >>> from a import MyDefined >>> yo=MyDefined() >>> yo <object MyDefined: yoyo> >>> print(yo) <object MyDefined: yoyo> 

从打印的结果就可以看到返回的是​​<object MyDefined: yoyo>​​,这样用户就知道返回的是什么实例对象,便于开发者理解。

​__repr__​​是直接输出对象(面向开发者),方便提供接口给开发者使用,如django里面的ORM查询,返回queryset对象。

​__str__​​ 使用

​ __str__​​方法是在print()打印的时候输出给用户看的,面向的是普通的用户,方便用户知道返回的是什么实例对象。

class MyDefined(object):      def __init__(self):         self.name = "yoyo"      def __str__(self):         return '<object MyDefined: {}>'.format(self.name) 

在终端调试

>python Python 3.6.6  >>> from a import MyDefined >>> yo=MyDefined() >>> yo <a.MyDefined object at 0x000001A4C133F128> >>> print(yo) <object MyDefined: yoyo> >>> 

从结果可以看到直接输入yo,返回的还是​​object at 0x000​​​,只有print()输出的时候才会打印​​__str__​​返回的内容

总结

注意:​​__str__()​​方法和​​__repr__()​​方法的返回值只能是字符串!

​__repr__​​和​​__str__​​这两个方法都是用于显示的,​​__str__​​是面向用户的,而​​__repr__​​面向开发者

关于调用两种方法的时机


  • 使用print()时
  • 使用%s和f'{}'拼接对象时
  • 使用str(x)转换对象x时
    在上述三种场景中,会优先调用对象的​​__str__()​​方法;若没有,就调用​​__repr__()​​方法;若再没有,则显示其内存地址。

特别地,对于下面两种场景:


  • 用%r进行字符串拼接时
  • 用repr(x)转换对象x时
    则会调用这个对象的​​__repr__()​​方法;若没有,则不再看其是否有​​__str__()​​方法,而是显示其内存地址。

当我们想在不同环境下支持不同的显示,例如终端用户显示使用​​__str__​​​,而程序员在开发期间则使用底层的​​__repr__​​​来显示,实际上​​__str__​​​只是覆盖了​​__repr__​​以得到更友好的用户显示。