Python __str__() 方法

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__() 方法可以用于返回包含换行符的多行字符串,以提供更详细或更美观的表示。这对于生成报告、日志信息或任何需要结构化文本输出的场景都非常有用。

上一篇: __del__()

下一篇: __repr__()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号