__str__和__repr__的目的是什么?

时间:2010-09-11 13:10:02

标签: python

我真的不明白Python中使用的__str____repr__在哪里。我的意思是,我得到__str__返回对象的字符串表示。但为什么我需要呢?在什么用例场景?另外,我读到了__repr__

的用法

但我不明白的是,我会在哪里使用它们?

8 个答案:

答案 0 :(得分:72)

__repr__

  

repr()内置函数和字符串转换(反向引号)调用,以计算对象的“官方”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境)。

__str__

  

str()内置函数和print语句调用,以计算对象的“非正式”字符串表示形式。

如果您有一个类,请使用__str__,并且每当您将此对象用作字符串的一部分时,您将需要信息性/非正式输出。例如。您可以为Django模型定义__str__方法,然后在Django管理界面中呈现。而不是像<Model object>这样的东西,你会得到一个人的姓名,事件的名称和日期等等。


__repr____str__相似,实际上有时相同(来自标准库BaseSet的{​​{1}}类示例):

sets.py

答案 1 :(得分:50)

您经常使用它们的地方是交互式会话。如果您打印一个对象,则会调用其__str__方法,而如果您只是单独使用一个对象,则会显示其__repr__

>>> from decimal import Decimal
>>> a = Decimal(1.25)
>>> print(a)
1.25                  <---- this is from __str__
>>> a
Decimal('1.25')       <---- this is from __repr__

__str__旨在尽可能以人为方式阅读,而__repr__应该旨在成为可用于重新创建对象的东西,尽管它通常不会是如何它就是在这种情况下创建的。

__str____repr__同样返回相同的值(当然也适用于内置类型)并不罕见。

答案 2 :(得分:13)

Grasshopper,如有疑问go to the mountainread the Ancient Texts。在其中你会发现__repr __()应该:

  

如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象。

答案 3 :(得分:10)

建立以前的答案并展示更多示例。如果使用得当,strrepr之间的差异很明显。简而言之,repr应返回一个可以复制粘贴的字符串,以重建对象的确切状态,而str对于loggingobserving调试结果非常有用。以下是一些示例,可以查看某些已知库的不同输出。

日期时间

print repr(datetime.now())    #datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)
print str(datetime.now())     #2017-12-12 18:49:27.134452

str可以打印到日志文件中,如果要直接运行它或将其作为命令转储到文件中,可以重新使用repr

x = datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)

numpy的

print repr(np.array([1,2,3,4,5])) #array([1, 2, 3, 4, 5])
print str(np.array([1,2,3,4,5]))  #[1 2 3 4 5]
在Numpy中,repr再次直接消耗品。

自定义Vector3示例

class Vector3(object):
    def __init__(self, args):
        self.x = args[0]
        self.y = args[1]
        self.z = args[2]

    def __str__(self):
        return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z)

    def __repr__(self):
        return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z)

在此示例中,repr再次返回可以直接使用/执行的字符串,而str作为调试输出更有用。

v = Vector3([1,2,3])
print str(v)     #x: 1, y: 2, z: 3
print repr(v)    #Vector3([1,2,3])
  

要记住一件事,如果str未定义但repr,则str会自动调用repr。因此,至少定义repr

总是好的

答案 4 :(得分:1)

str将是非正式且可读的格式,而repr将提供官方对象代表。

class Complex:
    # Constructor
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    # "official" string representation of an object
    def __repr__(self):
        return 'Rational(%s, %s)' % (self.real, self.imag)

    # "informal" string representation of an object (readable)
    def __str__(self):
        return '%s + i%s' % (self.real, self.imag)

    t = Complex(10, 20)

    print (t)     # this is usual way we print the object
    print (str(t))  # this is str representation of object 
    print (repr(t))  # this is repr representation of object   

Answers : 

Rational(10, 20) # usual representation
10 + i20      # str representation
Rational(10, 20)  # repr representation

答案 5 :(得分:1)

我们有一个没有__str__函数的类。

class Employee:

    def __init__(self, first, last, pay):
        self.first = first 
        self.last = last
        self.pay = pay

emp1 = Employee('Ivan', 'Smith', 90000)

print(emp1)

当我们打印该类实例emp1时,我们得到的是:

<__main__.Employee object at 0x7ff6fc0a0e48>

这不是很有帮助,并且如果我们使用它来显示(例如在html中),当然这不是我们想要打印的内容

因此,现在是相同的类,但是具有__str__函数:

class Employee:

    def __init__(self, first, last, pay):
        self.first = first 
        self.last = last
        self.pay = pay

    def __str__(self):
        return(f"The employee {self.first} {self.last} earns {self.pay}.")
        # you can edit this and use any attributes of the class

emp2 = Employee('John', 'Williams', 90000)

print(emp2)

现在,我们不再打印任何对象,而是通过返回__str__函数来指定:

The employee John Williams earns 90000

答案 6 :(得分:1)

str repr 都是两种表示方式。您可以在编写课程时使用它们。

class Fraction:
def __init__(self, n, d):
    self.n = n
    self.d = d
def __repr__(self):
    return "{}/{}".format(self.n, self.d)

例如,当我打印它的一个实例时,它会返回东西。

print(Fraction(1, 2))

产生

1/2

同时

class Fraction:
def __init__(self, n, d):
    self.n = n
    self.d = d
def __str__(self):
    return "{}/{}".format(self.n, self.d)
print(Fraction(1, 2))

也会导致

1/2

但是,如果您同时编写了两者,那么python使用哪个呢?

class Fraction:
def __init__(self, n, d):
    self.n = n
    self.d = d
def __str__(self):
    return "str"
def __repr__(self):
    return "repr"

print(Fraction(None, None))

这导致

str

因此,在编写两者时,python实际上使用的是 str 方法,而不是 repr 方法。

答案 7 :(得分:1)

假设你有一个类并希望检查一个实例,你看到打印并没有提供太多有用的信息

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


p1 = Person("John", 36)
print(p1)  # <__main__.Animal object at 0x7f9060250410>

现在看到一个带有 str 的类,它显示了实例信息,并且使用 repr 你甚至不需要打印。好不好?

class Animal:
    def __init__(self, color, age, breed):
        self.color = color
        self.age = age
        self.breed = breed

    def __str__(self):
        return f"{self.color} {self.breed} of age {self.age}"

    def __repr__(self):
        return f"repr : {self.color} {self.breed} of age {self.age}"


a1 = Animal("Red", 36, "Dog")
a1  # repr : Red Dog of age 36
print(a1)  # Red Dog of age 36