介绍
在本文中,您将了解在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()' 方法之间的差异,并在类中实施了这些特殊方法,以便您不需要直接调用它们。