python中的str与repr

本文探讨Python中的str和repr的区别。str关注可读性,适合用户终端输出,而repr则强调明确性,包含对象类型信息,适用于开发和调试。Python的一切皆为对象,操作对应对象的特殊方法。str和repr的默认行为及自定义实现也进行了详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

二者的区别

在 Python 中要将某一类型的变量或者常量转换为字符串对象通常有两种方法,即 str() 或者 repr()
一般来说,无论是在类中实现,还是单独使用。str() 的输出追求可读性,输出格式要便于理解,适合用于输出内容到用户终端。
repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用。

下面是一个例子:

>>> from datetime import datetime
>>> now=datetime.now()
>>> print(str(now))
2019-10-25 17:37:32.125564
>>> print(repr(now))
datetime.datetime(2019, 10, 25, 17, 37, 32, 125564)

通过 str() 的输出结果我们能很好地知道 now 实例的内容,但是却丢失了 now 实例的数据类型信息。而通过 repr() 的输出结果我们不仅能获得 now 实例的内容,还能知道 nowdatetime.datetime 对象的实例。

Python 中一切皆对象

Python Data Model 中指出,Python 中的所有数据都是“对象”(Object)。Python 中几乎所有(不确定有没有反例)的操作都可以对应到对象的某个特殊方法。因此可以通过手工实现它们来覆盖默认的逻辑。

比如说迭代器(iterator)取长度操作 len(iter) 对应 obj.__len__;加法操作 a + b 对应a.__add__(b);函数调用 func(...) 对应 func.__cal__(...)

同样的,str()内置函数使用 __str__ 显示对象的字符串表示形式,而 repr()内置函数使用 __repr__显示对象。

__str____repr__

python 默认有对__repr____str__ 的实现方法,当两者均使用缺省定义的情况下 __repr__是等同于__str__的。

__str__ 的默认实现是直接调用了 __repr__方法。所以仅定义 __repr__ 的时候, __repr__ == __str__,因此如果覆盖了 __repr__方法,__str__ 的结果也会随之改变。 但是仅定义 __str__ 的情况下,两者不相等。如果两者都定义了,结果也是不相等的。

例如:

# __str__ 和 __repr__都没有定义
class Test:
    pass

print(str(Test()))
print(repr(Test()))
print(str(Test()) == repr(Test()))

输出结果:

>>> print(str(Test))
<class '__main__.Test'>
>>> print(repr(Test))
<class '__main__.Test'>
>>> print(repr(Test) == str(Test))
True
# 只定义 __str__
class Test1:
    def __str__(self):
        return "Test1.__str__"

print(str(Test1()))
print(repr(Test1()))
print(str(Test1()) == repr(Test1()))

输出结果如下:

>>> print(str(Test1()))
Test1.__str__
>>> print(repr(Test1()))
<__main__.Test1 object at 0x000001F9B3DCD518>
>>> print(str(Test1()) == repr(Test1()))
False
# 只定义 __repr__
class Test2:
    def __repr__(self):
        return "Test1.__str__"

print(str(Test2()))
print(repr(Test2()))
print(str(Test2()) == repr(Test2()))

输出结果如下:

>>> print(str(Test2()))
Test2.__repr__
>>> print(repr(Test2()))
Test2.__repr__
>>> print(str(Test2()) == repr(Test2()))
True
两者均定义
class Test3:
    def __repr__(self):
        return "Test3.__repr__"
    def __str__(self):
        return "Test3.__str__"


print(str(Test3()))
print(repr(Test3()))
print(str(Test3()) == repr(Test3()))

输出的结果如下:

>>> print(str(Test3()))
Test3.__str__
>>> print(repr(Test3()))
Test3.__repr__
>>> print(str(Test3()) == repr(Test3()))
False

如果要自己实现,一般实现__str__就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值