Python中 __str__ 和 __repr__ 有什么区别?

Python中 strrepr 有什么区别?

Python是一门非常强大的编程语言,具备丰富的编程特性与语法糖。其中,Python提供了两个函数 __str____repr__ 来帮助我们输出对象的字符串表示。虽然这两个函数的初衷都是将对象转化为字符串,但它们之间还是存在着一些区别。

阅读更多:Python 教程

1. __str____repr__ 的作用

__str____repr__ 是两个特殊的函数(又称为“魔法方法”),它们都可以用来输出对象的字符串表示。

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

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

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

person = Person("Alex", 25)
print(person)  # Alex is 25 years old.
print(repr(person))  # Person(name='Alex', age=25)

在上面的示例中,__str__ 方法用于输出人类易于理解的字符串表示,而 __repr__ 方法用于输出程序员可读的表达式。

2. __str____repr__ 的实现方式

__repr__ 方法返回的是一个表达式,可以直接用于构建一个新对象,这个表达式的输出格式一般为 <ClassName(kwargs)>。而 __str__ 方法则是返回一个更加友好、易懂的字符串。

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):
        return f"Point(x={self.x}, y={self.y})"

point = Point(2, 3)
print(point)  # (2, 3)
print(repr(point))  # Point(x=2, y=3)

当我们打印一个对象时,Python会自动调用它的 __str__ 方法。如果该对象没有实现 __str__ 方法,Python会寻找对象的 __repr__ 方法,如果也没有实现,则输出默认的对象表示。

__repr__ 方法相对重要一些,它可以在对象的实例化后被调用,在交互模式下使用时非常有用,展示的信息比较详细。

3. __str____repr__ 的使用场景

  • __repr__ :代表一个对象的“开发者模式”,代码执行环境下运行,返回的字符串能够准确的表达出对象的所有信息,以便开发者实例化或重现一个与现有对象相同的新对象。
  • __str__ :代表一个对象的“用户模式”,用于输出给用户的信息,至少应表达出该对象的内部状态。如果对象拥有 __str__ 方法,则打印该对象时默认会调用 __str__ 方法输出。
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

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

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

p = Point(2,4)
print(p)  # Point(2, 4)
print(repr(p))  # Point(2, 4)

在上面的实例中,我们定义了一个简单的 Point 类,并分别实现了 __str____repr__ 方法。当打印对象 p 的时候,__str__ 方法的返回值会被打印出来,而 __repr__ 方法的返回值会被 repr() 函数调用,打印出来的字符串具有更高的可读性。

除此之外,我们还可以看看内置类型中的应用。例如,在 Python 中,列表(List)和集合(Set)同样都拥有 __repr__ 方法和 __str__ 方法。如果我们在 REPL(Python 命令行界面)中创建一个列表对象,我们会看到其 __repr__ 方法被调用。

>>> lst = [1, 2, 3, 4]
>>> lst
[1, 2, 3, 4]
>>> repr(lst)
'[1, 2, 3, 4]'
>>> str(lst)
'[1, 2, 3, 4]'

在上面的示例中,当我们打印 lst 时,列表的 __repr__ 方法被自动调用,并返回了列表 lst 的字符表示。如果使用 str() 函数打印 lst,则输出的是更加友好、易于理解的字符串。要注意,__repr__ 方法和 __str__ 方法旨在为常见类提供一个默认的实现,但它们同样可以被用户自定义的类所覆盖。

class Student:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"Student({self.name})"

    def __str__(self):
        return self.name

student = Student("Alice")
print(repr(student)) # Student(Alice)
print(str(student))  # Alice

在上面的示例中,我们定义了一个自定义的 Student 类。我们通过实现 __repr____str__ 方法,确保在使用 repr()str() 打印对象时返回的字符串表示是有意义的。

结论

在Python中,__str____repr__ 都可以用于输出对象的字符串表示,但它们之间还是存在着一些区别。虽然两者都可以输出字符串,但是__repr__ 返回的字符串通常更具有可读性和表达性,并且可以准确地重现该对象的状态和属性。而 __str__ 更适用于向用户展示对象的信息,提供一个更友好、易于理解的字符串表示。虽然在很多情况下只实现了 __str__ 方法,我们还是会根据需要去实现 __repr__ 方法,以达到更好的输出效果和更好的可读性。总之,开发者应该了解 __str____repr__ 的不同,并根据需要正确地选择使用它们。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程