介绍
Python中有两个将对象转字符串的魔法方法:__repr__
和__str__
。分别可以使用内建函数repr(obj)
和str(obj)
来调用。
很长一段时间我都不了解__repr__
的作用,经常连方法名都不记得,只是简单的将__repr__
理解为打印而__str__
则是字符化。
事实上,我错了。
我们可以打开Python控制台,输入以下代码:
s = "hello world"
s
print s
print repr(s)
print str(s)
注意,以上代码仅在控制台才能正确被执行。
上面代码输出以下内容:
‘hello world’
hello world
‘hello world’
hello world
真相
我们可以看到,第一个和第三个输出是相同的,字符串两侧带上了引号,第二个和第四个则是同样的输出字符串中的内容。
好像和我想象的不一样。
于是我help
了一把repr
,输出以下结果:
Help on built-in function repr in module __builtin__:
repr(…)
repr(object) -> stringReturn the canonical string representation of the object. For most object types, eval(repr(object)) == object.
一看到representation这个词就懂了,为啥叫repr
?原来是这个对象的字面表述。
因此我们知道了__repr__
的设计标准是eval(repr(object)) ==
object
,而不单单是输出内容啊。
扩展
Python字符串也提供了一个方式使用对象的__repr__
。
print "str:%s" % s
print "repr:%r" % s
输出:
str:hello world
repr:’hello world’