我真的不理解Python中的__str__
和__repr__
在哪里使用。我的意思是,我明白__str__
返回对象的字符串表示形式。但是,我为什么需要它?在什么情况下使用?此外,我还了解了__repr__
的用法。
但我不理解的是,我在哪里可以使用它们?
我真的不理解Python中的__str__
和__repr__
在哪里使用。我的意思是,我明白__str__
返回对象的字符串表示形式。但是,我为什么需要它?在什么情况下使用?此外,我还了解了__repr__
的用法。
但我不理解的是,我在哪里可以使用它们?
被内置函数
repr()
和字符串转换(反引号)调用,用于计算对象的“官方”字符串表示。如果可能的话,这应该看起来像一个有效的Python表达式,可以在适当的环境下用于重新创建具有相同值的对象。
被内置函数
str()
和
如果您有一个类,并且希望每当将此对象作为字符串的一部分使用时获得信息性/非正式输出,请使用__str__
。例如,您可以为Django模型定义__str__
方法,然后在Django管理界面中呈现。相比于某些像<Model object>
这样的东西,您会得到人的名字、事件的名称和日期等信息。
__repr__
和__str__
很相似,有时甚至相等(例如标准库中sets.py
文件的BaseSet
类的示例):
def __repr__(self):
"""Return string representation of a set.
This looks like 'Set([<list of elements>])'.
"""
return self._repr()
# __str__ is the same as __repr__
__str__ = __repr__
return self._repr()
的作用是什么?它表示 __repr__()
函数只接受一个参数。 - shining__repr__
代替 __str__
吗? - Amit Tripathi在交互式会话中,你经常会同时使用它们两个。如果你打印一个对象,那么它的__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__
返回相同的值也很常见。
在之前的答案基础上继续解释,并提供更多示例。如果使用得当,str
和repr
之间的区别是明确的。简而言之,repr
应该返回一个可以复制粘贴以重建对象精确状态的字符串,而str
适用于日志记录
和观察
调试结果。下面是一些示例,以查看一些已知库的不同输出。
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
总是个好习惯。
__repr__
的内容,官方文档并没有真正回答为什么要使用它的问题,而且仅仅因为一个问题在其他地方得到了回答,并不是不在SO上回答的好理由(通常情况下,谷歌搜索会把你带回这里!)如果你认为这个问题不值得回答,那么你可以选择不回答,尽管在这种情况下,我同意它已经在SO上很好地解决了,因此链接到重复的问题将是一个合适的回应。 - Scott Griffiths让我们创建一个没有 __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__
函数指定的返回值:
员工 John Williams 的工资为 90000
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
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
while
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方法,当两者同时被写入时。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("John", 36)
print(p1) # <__main__.Animal object at 0x7f9060250410>
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
__str__
相当于to_s
,__repr__
相当于inspect
。 - Ajedi32