__str__和__repr__有什么区别?

3667
28个回答

5
简而言之:
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'

4
了解__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

希望这能帮助您建立具体的基础,以便更深入地探索更多答案。

3
  1. __str__ 必须返回字符串对象,而 __repr__ 可以返回任何 Python 表达式。
  2. 如果缺少 __str__ 实现,则会使用 __repr__ 函数作为后备。如果缺少 __repr__ 函数实现,则没有后备。
  3. 如果 __repr__ 函数返回对象的字符串表示形式,则可以跳过实现 __str__ 函数。

来源:https://www.journaldev.com/22460/python-str-repr-functions


__repr__可以返回任何Python表达式”——你从哪里得到这个说法的?__repr__也需要返回一个字符串,而且表达式是语法的元素,不是对象,所以它们不能被“返回”。 - undefined
如果缺少__repr__函数的实现,就没有备用方案。—— 有一个备用方案:object.__repr__ - undefined

3

__repr__ 用于各处,但不包括 printstr 方法(当定义了一个 __str__ 时!)


3

有经验使用具有toString方法的编程人员往往会实现 __str__ 而不是 __repr__。 如果您只在 Python 中实现其中一个特殊方法,请选择 __repr__

来源:《流畅的Python》,作者:Ramalho, Luciano。


3
每个对象都从创建所有对象的基类继承__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__


2

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__())

0

基本上,__str__str()用于创建可供人类阅读的输出,必须面向最终用户。 另一方面,repr()__repr__主要返回对象的规范字符串表示形式,它们有助于程序员进行调试和开发。


"__str__str()是" — 你是指"__str__str()吗?它们并不是同一回事。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接