[Python面向对象编程] 特殊方法__str__和__repr__

Posted by Chase Shen on 2022-01-24
Estimated Reading Time 2 Minutes
Words 564 In Total
Viewed Times

特殊方法(有时也称为魔术方法)在Python中扮演着重要角色。它们由双下划线(__)包围的方法名定义,用于实现特定的内置行为或操作。最常见的特殊方法包括__str____repr__,它们分别用于定义对象的可打印表示和官方字符串表示。

__str__ 方法

  • 用途:

    • 定义了对象的“字符串表示”,它的主要目的是提供一个对象的可读性高的描述,用于打印对象或将对象转换为字符串时的友好显示。
    • 通常用于最终用户或消费者看到的输出。
    • 这使得 __str__ 方法非常适合日志记录、信息输出等需要向用户展示对象信息的场景。
  • 调用时机:
    当使用print函数或str()函数打印一个对象或将其转换为字符串时,会调用对象的__str__方法。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __str__(self):
return f"Person {self.name}, {self.age} years old"

# 创建实例
person = Person("Alice", 30)

# 打印实例
print(person) # 输出: Person Alice, 30 years old

假设您有一个 Person 类,您想要在打印其实例时提供一种格式化的显示方式。

__repr__ 方法

  • 用途:
    定义对象的官方字符串表示,适用于开发者。应该尽量让__repr__的输出精确到能够通过eval()重建该对象。
  • 调用时机:
    当在解释器中直接输出对象、调用repr()函数,或者在打印容器类型的对象时,会调用对象的__repr__方法。

示例:

1
2
3
4
5
6
7
8
9
10
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __repr__(self):
return f"Person({self.name!r}, {self.age!r})"

person = Person("Alice", 30)
print(repr(person)) # 调用 __repr__ 方法

注意事项

如果只实现了__repr__而没有实现__str__,那么当调用str()时,Python将会使用__repr__的结果。
通常,__repr__应该返回一个明确且不会产生歧义的字符串,理想情况下,这个字符串可以用来重建对象。
通过实现这些特殊方法,您可以控制对象的字符串表示,这在调试和日志记录时特别有用。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !