Python中__str__和__repr__方法很容易混淆,并在面试中偶尔会突然碰到提问区别是什么。
简单来说,__repr__的目的是unambiguous明确数据,而__str__是为了数据readable更加可读。
Python 的官方documentation说,__repr__是compute the "official" string representation of an object, __str__是compute the "informal" string representation of an object. 使用print输出的时候,str方法用的是__str__来显示输出对象,repr方法用的是__repr__来显示输出对象。
import datetime
today = datetime.datetime.now()
s = str(today)
print s
print type(s)
r = repr(today)
print r
print type(r)
try:
print eval(s)
print eval('s')
except:
pass
try:
print eval(r)
print type(eval(r))
print eval('r')
print type(eval('r'))
except:
pass
# result
2014-10-24 17:26:25.499000
<type 'str'>
datetime.datetime(2014, 10, 24, 17, 26, 25, 499000)
<type 'str'>
2014-10-24 17:26:25.499000
<type 'datetime.datetime'>
datetime.datetime(2014, 10, 24, 17, 26, 25, 499000)
<type 'str'>
根据输出的结果,我们可以很容易的区分两者的区别,str方法输出的结果可以很容易的让用户明白日期和时间。不同的是,repr方法虽然说也是返回了一个string,但是是python "official"的数据结构,是一个可以容易被再改造的数据。
str方法得到的string值不能被eval方法在转换为一个object,repr的可以。因为是一个string,所以应该用引号括起来,用eval方得到一个datetime的对象。
IDE中的输出我们并看不出结果的区别。 其实应该是这样的。
>>> x = 1
>>> repr(x)
'1'
>>> str(x)
'1'
>>> y = 'a string'
>>> repr(y)
"'a string'"
>>> str(y)
'a string'
数字没区别,对于string,repr会多加上一对双引号。
>>> repr(y)
"'a string'"
>>> y2 = eval(repr(y))
>>> y == y2
True
相对而言,repr和eval就是一对相异的方法。