介绍
在本文中,您将了解到在Python数据模型中定义的特殊方法__str__()
和__repr__()
。__str__()
和__repr__()
方法可通过记录或打印有关对象的有用信息来帮助调试Python代码。
Python的特殊方法以双下划线开头和结尾,非正式地被称为dunder方法。Dunder方法是Python内置运算符和函数的基础方法。应避免直接调用dunder方法,而是在类中实现dunder方法,然后使用调用它们的内置函数,如str()
和repr()
。
__str__()
和__repr__()
之间有什么区别?
__str__()
方法返回一个对象的人类可读的、或非正式的字符串表示。这个方法由内置的print()
、str()
和format()
函数调用。如果你没有为一个类定义__str__()
方法,那么内置对象实现将调用__repr__()
方法。
__repr__()
方法返回一个更丰富信息的、或官方的、对象字符串表示。这个方法由内置的repr()
函数调用。如果可能,返回的字符串应该是一个有效的Python表达式,可以用来重新创建对象。在所有情况下,字符串应该是信息丰富且不含歧义的。
一般来说,__str__()
字符串是为用户设计的,而__repr__()
字符串是为开发者设计的。
__str__()
和__repr__()
示例使用内置类
本节中的示例直接调用__str__()
和__repr__()
方法用于演示目的。
datetime.datetime
类是一个内置的Python类,它具有__str__()
和__repr__()
方法的默认实现。
以下是示例代码,显示了datetime.datetime
对象的__str__()
和__repr__()
方法的默认实现返回的字符串:
import datetime
mydate = datetime.datetime.now()
print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))
print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))
输出是:
Output__str__() string: 2023-01-27 09:50:37.429078
str() string: 2023-01-27 09:50:37.429078
__repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
输出显示str()
函数调用__str__()
并返回一个用户友好的字符串,而repr()
函数调用__repr__()
并返回一个更丰富的包含对象信息的字符串,可用于重新创建对象。实际上,你可以使用repr()
函数和eval()
函数从字符串创建新对象:
import datetime
mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))
print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))
print("the values of the objects are equal: ", mydate1==mydate2)
输出是:
Outputmydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
the values of the objects are equal: True
前面的示例代码从mydate1
的repr()
字符串创建了mydate2
对象,然后验证两个对象的值是否相等。
__str__()
和__repr__()
的新类示例
创建类时,应至少实现__repr__()
方法,以便在内置函数使用__repr__()
时返回有用的信息。
以下类未实现__str__()
或__repr()__
方法:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
使用str()
和repr()
时的输出为:
Output<__main__.Ocean object at 0x102892860>
<__main__.Ocean object at 0x102892860>
前面的例子演示了对象的__repr()__
默认实现,返回一个字符串,其中仅包含类和对象id
的十六进制格式,这并不是非常有用。请注意,str()
和repr()
返回相同的值,因为str()
在未实现__str__()
时调用__repr__()
。
使用__str__()
和__repr__()
方法更新Ocean类:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
def __str__(self):
return f'The creature type is {self.name} and the age is {self.age}'
def __repr__(self):
return f'Ocean(\'{self.name}\', {self.age})'
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
输出为:
OutputThe creature type is Jellyfish and the age is 5
Ocean('Jellyfish', 5)
前面例子中__str__()
的实现返回一个易于阅读的字符串,为用户提供了对象的相关详细信息。__repr__()
的实现返回一个字符串,它是一个有效的Python表达式,可用于重新创建对象:Ocean('Jellyfish', 5)
。该示例使用f-string格式化字符串,但您可以使用Python支持的任何格式格式化字符串。
结论
在这篇文章中,您探讨了__str__()
和__repr__()
方法之间的差异,并在一个类中实现了这些特殊方法,这样您就不需要直接调用它们。通过我们的Python字符串教程更深入地了解在Python中处理字符串的方法。
Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions