Python中 str 和 repr 有什么区别?
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__ 的不同,并根据需要正确地选择使用它们。
极客笔记