介绍
在上一篇文章中,我们在__new__
和__init__
之间进行了比较。在这篇文章中,我们将做类似的事情,但是有另一对。
对于那些不知道的人,__str__()
和__repr__()
是两种dunder方法
这两个小功能一直是我早期职业生涯中的困惑。让我们首先逐一浏览它们,让我们首先了解他们的所作所为。然后,我们将在它们之间的相似性和差异中进行比较。
__str __()和str()
如果您在进入Python之前已经使用过其他语言,则可能熟悉str()
或string()
函数,它们会将任何其他数据类型都投入到字符串数据类型或类中。
python的行为相同。这是python repl的一个示例。
>>> my_int = 2
>>> type(my_int)
<class 'int'>
>>> my_str = str(my_int)
>>> type(my_str)
<class 'str'>
simlar是repr()
函数。 repr
还返回一个字符串。
>>> my_int = 2
>>> type(my_int)
<class 'int'>
>>> my_repr = repr(my_int)
>>> type(my_repr)
<class 'str'>
__repr __()和repr()
现在,您知道两种义义方法都有其相应的函数符号,您可以在其中传递另一种数据类型。
``我们还在上一节中看到,当您将任何内容传递给reter()时,它只是变成str数据类型。
__st __()和__repr __()在类中
如果您仍然不了解Dunder方法,则本节可能会帮助您开采。
有一个massive list of Python dunder methods。 Dunder方法允许您的手写课程以某种方式行事。
两种方法之间的区别在于,__str__
旨在提供对象的人类可读表示,而__repr__
应提供可用于重新创建对象的表示形式。
让我们在一个简单的代码示例的帮助下查看两者之间的区别:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"({self.x}, {self.y})"
def __repr__(self):
return f"Point({self.x}, {self.y})"
p = Point(1, 2)
print(p) # Output: (1, 2)
print(repr(p)) # Output: Point(1, 2)
在上面的示例中,__str__
返回旨在为人类可读的点对象的字符串表示。 __repr__
方法返回一个可以用来重新创建对象的字符串表示。
通常,建议始终为对象定义__repr__
方法,以便您对可以用于调试或在重型环境中使用的对象的明确表示。另一方面,通常仅在需要更可读的表示形式时定义__str__
。如果未针对对象定义__str__
,则使用repr(obj)
作为后备。
值得注意的是,__str__
方法应返回字符串,而__repr__
方法应返回一个字符串,该字符串(将传递给eval()
函数)返回具有相同值的对象。 __repr__
的推荐格式是一个字符串,当传递给eval()
时,它会创建一个与原始值相同的对象。在上面的示例中,可以通过调用Point(1, 2)
来重新创建Point
对象。
结论
总而言之,__str__
和__repr__
是Python中的两种重要方法,使您可以定义对象的字符串表示。了解两者之间以及何时使用它们之间的区别对于创建强大且设计良好的代码很重要。
继续阅读: