__repr__和 __str__的区别与联系[Python3 学习笔记]

257 阅读2分钟

strrepr都是Python中的特殊函数,它们一起配合完成了Python中变量的文本描述功能

__str__函数

str相当于Java中的toString方法,当你使用print(),formatstr()调用一个对象时,这个对象的__str__函数就会被运行并返回一个对象的“非正式”或格式良好的字符串表示,返回值必须为一个字符串对象.

class Demo:
    def __init__(self, name: str):
        self._name = name

    def __str__(self):
        return f"Demo instance {self._name=}"


d = Demo("thinktik")

print("str函数输出", str(d))
print("format函数输出", format(d))
print("print打印", d)

输出:

str函数输出 Demo instance self._name='thinktik'
format函数输出 Demo instance self._name='thinktik'
print打印 Demo instance self._name='thinktik'

__repr__函数

repr函数是Python中的特殊方法,当一个对象被repr()函数调用的时候,该对象的__repr__函数就会运行并返回该对象的对象的“官方”字符串表示

如果可能,__repr__应返回类似一个有效的Python表达式,能被用来重建具有相同取值的对象(只要有适当的环境).如果这不可能,则应返回形式如<...some useful description...>的字符串,返回值必须是一个字符串对象.

此方法通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的.

当我们重写了__repr__函数并使用repr()调用时会有如下输出

class Demo:
    def __init__(self, name: str):
        self._name = name

    def __repr__(self):
        return f"Demo instance repr {self._name=}"


d = Demo("thinktik")

print(repr(d))

输出:

Demo instance repr self._name='thinktik'

当我们不重写__repr__函数,那么默认产生改对象在的原始描述,它带有该对象在内存中的地址.

class Demo:
    def __init__(self, name: str):
        self._name = name

    # def __repr__(self):
    #     return f"Demo instance repr {self._name=}"


d = Demo("thinktik")

print(repr(d))

输出:

<__main__.Demo object at 0x0000020C46411FD0>

区别与联系

  • 区别: __repr__一般用在debug中,输出一些关键型的实时状态描述;__str__一般用在文本化的描述上,比如控制台打印等
  • 联系: 如果一个类定义了__repr__但未定义__str__,则在需要该类的实例的“非正式”字符串表示时也会使用__repr__

也就是当一个类中的__str__没有定义但是定义了__repr__,那么在需要__str__的时候就会使用__repr__代替.

class Demo:
    def __init__(self, name: str):
        self._name = name

    # def __str__(self):
    #     return f"Demo instance {self._name=}"

    def __repr__(self):
        return f"Demo instance repr {self._name=}"


d = Demo("thinktik")
print(d)

输出:

Demo instance repr self._name='thinktik'