天天看点

python中str(),__str__与repr(),__repr__的区别

我们来看一个例子:

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