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__
的不同,并根据需要正确地选择使用它们。