最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

python中的str与repr

XAMPP相关 中文小张 351浏览 0评论

二者的区别
在 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

转载请注明:XAMPP中文组官网 » python中的str与repr