我们来看一个例子:
import datetime
today = datetime.datetime.now()
print('------ str() ------')
s = 'Hello, Geeks.'
print (str(s))
print (str(2.0/11.0))
print (str(today))
print()
print('------ repr() ------')
s = 'Hello, Geeks.'
print (repr(s))
print (repr(2.0/11.0))
print (repr(today))
输出:
------ str() ------
Hello, Geeks.
0.18181818181818182
2021-02-28 10:28:47.678824
------ repr() ------
'Hello, Geeks.'
0.18181818181818182
datetime.datetime(2021, 2, 28, 10, 28, 47, 678824)
在输出信息上,对于第一个字符串的实验,repr()函数比str()函数多加了一个标志字符串的’ ’ 符号,对于数值计算的例子,从这个结果中没有区别,从原理上说,repr()函数的输出位数会比str()函数多,对于datetime的例子,str()函数仅输出了当前的时间信息,而repr()函数还输出了标志datetime的信息。所以总体来说,repr()函数的输出信息更加丰富。
总结:
- str()函数是面向用户的函数,追求表现给用户的信息简洁简单
- repr()函数是面向开发者的函数,追求表达给开发者的信息全面
__repr__和__str__是str(),repr()这两个内置函数在类中使用时的接口
我们来看一下在类中应该怎么使用这两个接口:
# Python program to demonstrate writing of __repr__ and
# __str__ for user defined classes
# A user defined class to represent Complex numbers
class Complex:
# Constructor
def __init__(self, real, imag):
self.real = real
self.imag = imag
# For call to repr(). Prints object's information
def __repr__(self):
return 'Rational(%s, %s)' % (self.real, self.imag)
# For call to str(). Prints readable form
def __str__(self):
return '%s + i%s' % (self.real, self.imag)
# Driver program to test above
t = Complex(10, 20)
# Same as "print t"
print (str(t))
print (repr(t))
#__str__和__repr__的作用还包括如果直接打印这个类的实例时,可以直接显示这两个接口中定义的内容,而不是仅仅返回实例在内存中的信息。
#如果把这个类中的__str__,__repr__注释掉,print(t)就会显示t这个实例在内存中的位置,
#而如果取消他们的注释,就会显示他们中编写的代码,那么__str__,repr__同时存在时,会显示哪个的呢?还是会都显示?
#如果同时存在,是会显示__str__中定义的代码体
print(t)
10 + i20
Rational(10, 20)
10 + i20