str和repr都是Python中的特殊函数,它们一起配合完成了Python中变量的文本描述功能
__str__函数
str相当于Java中的toString方法,当你使用print(),format和str()调用一个对象时,这个对象的__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'