Python __str__() 语法
__str__() 是 Python 的一个特殊方法(又称 “魔法方法” 或 “双下划线方法”),它定义了当对象调用 str() 或 print() 函数时,如何将该对象转换为字符串。
语法:
class MyClass:
def __str__(self):
# 返回对象的字符串表示
return value
说明:
__str__() 方法不接收任何参数,除了 self(实例本身)。
__str__() 方法必须返回一个字符串,该字符串应该是一个 “非正式” 的、可读性强的表示,旨在供最终用户或日志输出使用。
注意:
- 如果一个类实现了 __str__() 方法,那么当对该类的实例调用 str() 或 print() 函数时,Python 会自动调用这个方法。
- 与 __repr__() 方法不同,__str__() 返回的字符串通常是为了方便人类阅读,而 __repr__() 返回的字符串通常是为了方便机器阅读。
Python __str__() 摘要
| 属于 | Python 魔法方法 |
|---|---|
| 使用频率 | 高 |
| 官方文档 | 查看 |
| 相关方法 | __repr__() |
Python __str__() 示例
接下来,我们通过几个简单的例子来讲解一下 Python __str__() 方法是如何使用的。
示例 1:__str__() 基本用法
class Book:
def __init__(self, title, author, year):
self.title = title
self.author = author
self.year = year
def __str__(self):
return f'书名:《{self.title}》,作者:{self.author},出版年份:{self.year}'
# 创建 Book 实例
book = Book('Python 即学即用', '阿莫', 2022)
# 使用 print() 打印对象,会自动调用 __str__()
print(book)
# 使用 str() 函数转换对象
str_book = str(book)
print(str_book)
运行结果如下。
书名:《Python 即学即用》,作者:阿莫,出版年份:2022
书名:《Python 即学即用》,作者:阿莫,出版年份:2022
分析:
在 Book 类中,我们自定义实现了 __str__() 方法。当对 Book 实例使用 print() 或 str() 函数时,Python 会自动调用我们定义的 __str__() 方法,并返回一个自定义的字符串,而不是默认的内存地址表示。
示例 2:__str__() 与 __repr__() 的区别
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
# 对用户友好的字符串表示
return f'点({self.x}, {self.y})'
def __repr__(self):
# 对开发者友好的字符串表示,可用于 eval()
return f'Point({self.x}, {self.y})'
p = Point(10, 20)
# 使用 print() 打印,会优先调用 __str__()
print(p)
# 直接在解释器中显示,会优先调用 __repr__()
# 如果没有 __str__(),print() 会回退到 __repr__()
print(str(p))
print(repr(p))
# 列表或元组中的对象,通常使用 __repr__()
points = [p, Point(1, 2)]
print(points)
运行结果如下。
点(10, 20)
点(10, 20)
Point(10, 20)
[Point(10, 20), Point(1, 2)]
分析:
__str__() 主要用于返回对用户友好的字符串表示,而 __repr__() 主要用于对开发者友好的字符串表示。
在这个例子中,当我们直接使用 print() 打印 p 时,__str__() 方法会被调用。如果一个类没有定义 __str__(),那么 print() 会回退到调用 __repr__()。
示例 3:没有 __str__() 方法的类
class MyObject:
def __init__(self, data):
self.data = data
obj = MyObject([1, 2, 3])
print(obj)
print(str(obj))
运行结果如下。
<__main__.MyObject object at 0x0000025802516E40>
<__main__.MyObject object at 0x0000025802516E40>
分析:
如果一个类没有定义 __str__() 方法,那么 print() 和 str() 会回退到使用对象的 __repr__() 方法。如果连 __repr__() 也没有定义,则会使用默认的、不太友好的表示(通常是对象的类型和内存地址)。
示例 4:__str__() 返回多行字符串
class Report:
def __init__(self, title, items):
self.title = title
self.items = items
def __str__(self):
header = f'--- {self.title} 报告 ---'
item_lines = [f'- {item}' for item in self.items]
return '\n'.join([header] + item_lines + ['--- 报告结束 ---'])
report = Report(
'每日销售概览',
['苹果: 80个', '香蕉: 50个', '橙子: 75个']
)
print(report)
运行结果如下。
--- 每日销售概览 报告 ---
- 苹果: 80个
- 香蕉: 50个
- 橙子: 75个
--- 报告结束 ---
分析:
__str__() 方法可以用于返回包含换行符的多行字符串,以提供更详细或更美观的表示。这对于生成报告、日志信息或任何需要结构化文本输出的场景都非常有用。
