我真的不明白Python中使用的__str__
和__repr__
在哪里。我的意思是,我得到__str__
返回对象的字符串表示。但为什么我需要呢?在什么用例场景?另外,我读到了__repr__
但我不明白的是,我会在哪里使用它们?
答案 0 :(得分:72)
由
repr()
内置函数和字符串转换(反向引号)调用,以计算对象的“官方”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境)。
由
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 mountain和read the Ancient Texts。在其中你会发现__repr __()应该:
如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象。
答案 3 :(得分:10)
建立以前的答案并展示更多示例。如果使用得当,str
和repr
之间的差异很明显。简而言之,repr
应返回一个可以复制粘贴的字符串,以重建对象的确切状态,而str
对于logging
和observing
调试结果非常有用。以下是一些示例,可以查看某些已知库的不同输出。
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)
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
再次直接消耗品。
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