Python中__repr__和__str__的区别


Python中reprstr的区别

TL;DR

str用于友好显示,一般写程序的话,修改一下__str__()也就够了。repr用于debug,包含的信息要尽可能多,尽可能准确。

__repr____str__

class Person:
  def __init__(self, name):
    self.name = name

jack = Person('Jack')

In [20]: jack
Out[20]: <__main__.Person at 0x10787b240>

In [21]: print(jack)
<__main__.Person object at 0x10787b240>

可以看到上面的打印效果并不是很好,显示的是内存的地址。

下面用__repr__重构一下:

class Person:
  def __init__(self, name):
    self.name = name
  def __repr__(self):
    return f'Person({self.name})'

jack = Person('Jack')

In [23]: jack
Out[23]: Person(Jack)

In [24]: print(jack)
Person(Jack)

使用__repr__()重构后,不管是直接输出对象还是使用print打印,显示的结果都是我们在__repr__()里定义的格式。

下面我们再试试__str__:

class Person:
  def __init__(self, name):
    self.name = name
  def __str__(self):
    return f'Person({self.name})'

jack = Person('Jack')

In [27]: jack
Out[27]: <__main__.Person at 0x107983f28>

In [28]: print(jack)
Person(Jack)

使用__str__()重构后,直接输出对象的结果是内存地址,而使用print打印的话,显示的则是__str__()里定义的格式。

最佳实践

str 用于友好显示

obj.__str__() 方法会在 print(obj)'{}'.format(obj) 时被调用,一般是为了给用户提供”友好的”显示。一般写程序的话,修改一下__str__()也就够了。

repr 用于debug

repr(obj) 可以获取 obj 的字符串表示,而这个操作相当于调用了 obj.repr()

In [31]: repr(jack)
Out[31]: '<__main__.Person object at 0x107983f28>'

repr(x) 给出了对象的类型及对象的 ID (内存地址),这些信息通常用于debug,所以生成的结果要尽可能包含可能多的信息,信息也要尽可能明确。

参考资料


文章作者: BrambleXu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 BrambleXu !
评论
  目录