
二者的区别
在 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
实例的内容,还能知道 now
是 datetime.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__
就行。