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

介绍

在本文中,您将了解在Python数据模型中定义的特殊方法__str__()和__repr__()。

Python 特殊方法始于并以双重分数结束,并非正式地被称为 dunder methods. Dunder 方法是 Python 内置操作员和函数的底层方法. 您应该避免直接调用 dunder 方法,而不是在您的类中实施 dunder 方法,然后使用呼叫它们的内置函数,如 str()repr()

str()」和「repr()」有什么区别?

该方法由内置的 print(), str(),和 format() 函数命名。如果您没有为一个类定义一个 __str__() 方法,那么内置的对象实现会代替它叫 __repr__() 方法。

__repr__() 方法返回一个对象的更丰富信息或官方的字符串表示. 这个方法被内置的 repr() 函数命名。 如果可能的话,返回的字符串应该是一个有效的 Python 表达式,可以用来重现对象。

一般而言,__str__()字符串是为用户而__repr__()字符串是为开发人员而设计的。

__str__()__repr__() 示例使用内置类

本节中的示例将__str__()__repr__()方法直接用于演示目的。

datetime.datetime 类是一个内置的 Python 类,它具有__str__()__repr__()方法的默认实现。

下面的示例代码显示了对象datetime.datetime__str__()__repr__()方法的默认实现返回的字符串:

1import datetime
2
3mydate = datetime.datetime.now()
4
5print("__str__() string: ", mydate.__str__())
6print("str() string: ", str(mydate))
7
8print("__repr__() string: ", mydate.__repr__())
9print("repr() string: ", repr(mydate))

产量是:

1[secondary_label Output]
2__str__() string:  2023-01-27 09:50:37.429078
3str() string:  2023-01-27 09:50:37.429078
4__repr__() string:  datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
5repr() string:  datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)

输出显示str()函数调用__str__()并返回人为友好的字符串,而repr()函数调用__repr__()并返回一个可用于重建对象的信息丰富的字符串。

1import datetime
2
3mydate1 = datetime.datetime.now()
4mydate2 = eval(repr(mydate1))
5
6print("mydate1 repr() string: ", repr(mydate1))
7print("mydate2 repr() string: ", repr(mydate2))
8
9print("the values of the objects are equal: ", mydate1==mydate2)

产量是:

1[secondary_label Output]
2mydate1 repr() string:  datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
3mydate2 repr() string:  datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
4the values of the objects are equal:  True

上面的示例代码将从repr()字符串中创建mydate2对象,然后验证两个对象的值是否等同。

__str__()__repr__() 示例 使用新类

创建类时,至少应该执行 ___repr__() 方法,以便在内置函数使用 repr() 时返回有用的信息。

下列类不执行 __str__()__repr()__ 方法:

 1class Ocean:
 2
 3    def __init__(self, sea_creature_name, sea_creature_age):
 4        self.name = sea_creature_name
 5        self.age = sea_creature_age
 6
 7c = Ocean('Jellyfish', 5)
 8
 9print(str(c))
10print(repr(c))

当您使用 str()repr() 时的输出是:

1[secondary_label Output]
2<__main__.Ocean object at 0x102892860>
3<__main__.Ocean object at 0x102892860>

上面的示例显示,对象的默认实现 __repr()__ 会返回一个仅包含类和对象 id` 的字符串,这不是非常有用的。

更新 Ocean 类以实现 __str__()__repr__() 方法:

 1class Ocean:
 2
 3    def __init__(self, sea_creature_name, sea_creature_age):
 4        self.name = sea_creature_name
 5        self.age = sea_creature_age
 6
 7    def __str__(self):
 8        return f'The creature type is {self.name} and the age is {self.age}'
 9
10    def __repr__(self):
11        return f'Ocean(\'{self.name}\', {self.age})'
12
13c = Ocean('Jellyfish', 5)
14
15print(str(c))
16print(repr(c))

产量是:

1[secondary_label Output]
2The creature type is Jellyfish and the age is 5
3Ocean('Jellyfish', 5)

在上面的示例中,实施 __str__() 会返回一个易于阅读的字符串,为用户提供对象的相关细节。 实施 repr() 会返回一个字符串,这是一个有效的 Python 表达式,可以用来重现对象: `Ocean ('Jellyfish', 5)'。

结论

在本文中,您探索了 __str__() 和 `repr()' 方法之间的差异,并在类中实施了这些特殊方法,以便您不需要直接调用它们。

Published At
Categories with 技术
comments powered by Disqus