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