Python 中的 `__str__ `方法

什么是 __str__ 方法?

str 方法是 Python 的内置方法之一,用于返回对象的可读字符串表示。当你打印一个对象,或者使用 str() 函数时,Python 会自动调用该对象的 str 方法。

简单来说,str 决定了当我们将对象转换为字符串时,显示的内容是什么。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

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

# 创建对象
person = Person("Alice", 30)

# 打印对象
print(person)  # 输出: Person(name=Alice, age=30)

# 使用 str() 函数
print(str(person))  # 输出: Person(name=Alice, age=30)

在这个示例中,Person 类实现了__str__方法,当我们打印 person 对象时,Python 会调用 __str__ 方法来获取对象的字符串表示。这样我们可以更直观地理解 person 对象的内容。

#__str____repr__ 的区别
在谈论__str__时,另一个常见的魔法方法是 __repr__。两者都涉及对象的字符串表示,但它们的用途和侧重点不同:

__str__:用于提供用户友好的字符串表示,主要供人类阅读。当我们使用 print() 或 str() 时,调用的是 __str__
__repr__:用于提供开发者友好的字符串表示,应该尽量返回能够精确重建该对象的代码表达。当我们在交互式环境中直接输入对象名,或者使用 repr() 时,调用的是 __repr__

举例说明

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"

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

# 创建对象
person = Person("Alice", 30)

# 使用 print() 调用__str__
print(person)  # 输出: Person: Alice, 30 years old

# 使用 repr() 调用 __repr__
print(repr(person))  # 输出: Person(name='Alice', age=30)

# 直接在交互式环境中查看对象,默认调用 __repr__
person  # 输出: Person(name='Alice', age=30)

__str__应用场景

打印对象时的显示

当我们使用 print() 函数打印对象时,__str__ 方法自动被调用。这是最典型的应用场景,__str__ 方法可以帮助我们将对象的主要信息直观地展示给用户。

class Order:
    def __init__(self, order_id, customer_name, total_amount):
        self.order_id = order_id
        self.customer_name = customer_name
        self.total_amount = total_amount

    def __str__(self):
        return f"Order({
      
      self.order_id}): {
      
      self.customer_name}, Total: ${
      
      self.total_amount:.2f}"

# 打印订单对象
order = Order(1001, "Alice", 250.75)
print(order)  # 输出: Order(1001): Alice, Total: $250.75

转换为字符串

当对象传入 str() 函数时,__str__ 方法被调用。这可以用于需要将对象转为字符串进行展示、记录日志或存储时。

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __str__(self):
        return f"Product: {
      
      self.name}, Price: ${
      
      self.price:.2f}"

# 将对象转换为字符串进行日志记录
product = Product("Laptop", 999.99)
log_message = f"Added {
      
      str(product)} to cart."
print(log_message)  # 输出: Added Product: Laptop, Price: $999.99 to cart.

调试信息

__str__ 可以为开发者提供简洁的调试信息,帮助快速理解对象的状态。虽然调试中更常用的是 __repr__ 方法,但有时 __str__ 的易读性也非常重要。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Point({
      
      self.x}, {
      
      self.y})"

# 调试时查看对象状态
point = Point(10, 20)
print(point)  # 输出: Point(10, 20)

图形用户界面 (GUI) 或命令行界面 (CLI) 的显示

在 GUI 或 CLI 应用中,很多时候需要将对象的状态呈现给用户,__str__ 可以为用户展示易读的信息格式。

class Task:
    def __init__(self, task_name, due_date):
        self.task_name = task_name
        self.due_date = due_date

    def __str__(self):
        return f"Task: {
      
      self.task_name}, Due: {
      
      self.due_date}"

# CLI工具展示任务列表
task = Task("Submit assignment", "2024-10-10")
print(task)  # 输出: Task: Submit assignment, Due: 2024-10-10