在Python中如何使用__str__()和__repr__()方法
引言
在本文中,您将了解在Python数据模型中定义的特殊方法__str__()和__repr__()。通过记录或打印有关对象的有用信息,__str__()和__repr__()方法可以帮助调试Python代码。
Python的特殊方法以双下划线开头和结尾,非正式地被称为双下划线方法。双下划线方法是Python内置运算符和函数的基础方法。应避免直接调用双下划线方法,而是在您的类中实现这些双下划线方法,然后使用调用它们的内置函数,例如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))
输出是:
__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)
输出为:
mydate1 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()时的输出结果是:
<__main__.Ocean object at 0x102892860> <__main__.Ocean object at 0x102892860>
前面的例子证明了对象的__repr__()的默认实现返回一个只包含类和对象id的十六进制格式的字符串,这并不是很有用。请注意,str()和repr()返回相同的值,因为当__str__()未实现时,str()会调用__repr__()。
更新Ocean类,实现__str__()和__repr__()方法的功能。
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))
输出结果为:
The 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处理字符串。