class Demo:
def __repr__(self):
return 'repr'
def __str__(self):
return 'str'
demo = Demo()
print(demo) # use __str__, output 'str' to stdout
s = str(demo) # __str__ is used, return 'str'
r = repr(demo) # __repr__ is used, return 'repr'
import logging
logger = logging.getLogger(logging.INFO)
logger.info(demo) # use __str__, output 'str' to stdout
from pprint import pprint, pformat
pprint(demo) # use __repr__, output 'repr' to stdout
result = pformat(demo) # use __repr__, result is string which value is 'str'
__str__
和__repr__
的含义,并在所有情况下永久区分它们。
__str__
返回给定对象的字符串形式,以便更容易阅读。__repr__
返回给定对象的实际形式(返回它自己),以便更容易识别。In [30]: str(datetime.datetime.now())
Out[30]: '2017-12-07 15:41:14.002752'
Disguised in string form
__repr__
:In [32]: datetime.datetime.now()
Out[32]: datetime.datetime(2017, 12, 7, 15, 43, 27, 297769)
Presence in real body which allows to be manipulated directly.
我们可以方便地对 __repr__
的结果进行算术运算。
In [33]: datetime.datetime.now()
Out[33]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521)
In [34]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521) - datetime.datetime(2
...: 017, 12, 7, 15, 43, 27, 297769)
Out[34]: datetime.timedelta(0, 222, 443752)
如果在 __str__
上应用此操作
In [35]: '2017-12-07 15:43:14.002752' - '2017-12-07 15:41:14.002752'
TypeError: unsupported operand type(s) for -: 'str' and 'str'
In [36]: str('string_body')
Out[36]: 'string_body' # in string form
In [37]: repr('real_body')
Out[37]: "'real_body'" #its real body hide inside
__str__
必须返回字符串对象,而 __repr__
可以返回任何 Python 表达式。__str__
实现,则会使用 __repr__
函数作为后备。如果缺少 __repr__
函数实现,则没有后备。__repr__
函数返回对象的字符串表示形式,则可以跳过实现 __str__
函数。来源:https://www.journaldev.com/22460/python-str-repr-functions
__repr__
用于各处,但不包括 print
和 str
方法(当定义了一个 __str__
时!)
有经验使用具有
toString
方法的编程人员往往会实现__str__
而不是__repr__
。 如果您只在 Python 中实现其中一个特殊方法,请选择__repr__
。
来源:《流畅的Python》,作者:Ramalho, Luciano。
__repr__
方法。class Person:
pass
p=Person()
如果你调用repr(p)
,默认输出如下:
<__main__.Person object at 0x7fb2604f03a0>
但是,如果您调用str(p)
,将会得到相同的输出。这是因为当__str__
不存在时,Python会调用__repr__
。
让我们实现自己的__str__
方法。
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def __repr__(self):
print("__repr__ called")
return f"Person(name='{self.name}',age={self.age})"
p=Person("ali",20)
print(p)
和 str(p)
将会返回:
__repr__ called
Person(name='ali',age=20)
我们来添加__str__()
函数。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
print('__repr__ called')
return f"Person(name='{self.name}, age=self.age')"
def __str__(self):
print('__str__ called')
return self.name
p=Person("ali",20)
如果我们调用print(p)
和str(p)
,它将调用__str__()
,因此它将返回
__str__ called
ali
repr(p)
将返回
repr调用 "Person(name='ali, age=self.age')"
让我们省略__repr__
,并只实现__str__
。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
print('__str__ called')
return self.name
p=Person('ali',20)
print(p)
会查找 __str__
并返回:
__str__ called
ali
注意:如果我们已经定义了__repr__
和__str__
,那么f'name is {p}'
将会调用__str__
。
repr()在我们进行调试或记录日志时使用。它用于帮助开发人员理解代码。
另一方面,str()用于非开发人员(如QA)或用户。
class Customer:
def __init__(self,name):
self.name = name
def __repr__(self):
return "Customer('{}')".format(self.name)
def __str__(self):
return f"cunstomer name is {self.name}"
cus_1 = Customer("Thusi")
print(repr(cus_1)) #print(cus_1.__repr__())
print(str(cus_1)) #print(cus_1.__str__())
基本上,__str__
或str()用于创建可供人类阅读的输出,必须面向最终用户。
另一方面,repr()或__repr__
主要返回对象的规范字符串表示形式,它们有助于程序员进行调试和开发。
__str__
或str()
是" — 你是指"__str__
和str()
吗?它们并不是同一回事。 - undefined
__repr__
可以返回任何Python表达式”——你从哪里得到这个说法的?__repr__
也需要返回一个字符串,而且表达式是语法的元素,不是对象,所以它们不能被“返回”。 - undefined__repr__
函数的实现,就没有备用方案。—— 有一个备用方案:object.__repr__
- undefined