《Python 语法浅析:Difference between __str__ and __repr__ in Python》

背景

"Difference between str and repr in Python"(stackoverflow.com/questions/1… 是 Stack Overflow 上的一个问题。

在此,笔者将从代码 & 语法两个层次,进行分析。

代码浅析

class Test(object): pass
test = Test()
str(test)                   # <__main__.Test object at 0x108ff4f28>
repr(test)                  # <__main__.Test object at 0x108ff4f28>

class Repr(object):
    def __repr__(self): 
        return '__repr__'
r = Repr()
str(r)                      # '__repr__'
repr(r)                     # '__repr__'

class Str(object):
    def __str__(self): 
        return '__str__'
s = Str()                   
str(s)                      # '__str__'
repr(s)                     # '<__main__.Str object at 0x109170898>'
复制代码

由以上代码,可以看出来:如果你覆盖了 __repr__ 方法,__str__ 也适用,但反之亦然。

语法浅析

repr(object)
    返回包含一个对象的可打印表示形式的字符串。
    类可以通过定义 __repr__() 方法来控制此函数为它的实例所返回的内容。

object.__repr__(self)
    由 repr() 内置函数调用以输出一个对象的'官方'字符串表示。
    此方法通常被用于调试。面向程序员


str(object='')
    返回 object 的字符串版本。即返回 object.__str__()。
    如果 object 没有 __str__ 方法,则返回 repr(object)。

object.__str__(self)
    通过 str(object) 以及内置函数 format() 和 print() 的调用,生成一个对象的字符串表示。
    返回值必须是字符串对象
    内置类型 object 所定义的默认实现会调用 object.__repr__()。
复制代码

由以上可知:

  • __repr__ 适用于开发调试
  • __str__ 适用于用户(例如:输出、format()、print())
  • object.__str__ 会调用 object.__repr__

总结

如果你只想实现两个特殊方法中的一个,__repr__ 是更好的选择,因为如果一个对象没有 __str__ 函数,而 Python 又需要调用它的时候,解释器会用 __repr__ 作为代替。

转载于:https://juejin.im/post/5cffba86e51d454d544abf35

猜你喜欢

转载自blog.csdn.net/weixin_34293902/article/details/93181933