如何在Python中使用__str__()和__repr__()方法

介绍

在本文中,您将了解到在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)

输出是:

Output
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

前面的示例代码从mydate1repr()字符串创建了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))

输出为:

Output
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中处理字符串的方法。

Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions