1. __str__ 和 __repr__ 方法介绍
在 Python 中,每个对象都有 __str__ 和 __repr__ 方法,用于返回对象的字符串表示。这两个方法的默认实现都是返回对象的内存地址,但是我们可以通过自定义这两个方法来返回对象更有含义的文本表示。
__str__ 方法返回对象的可读性好的字符串表示,主要用于代码的日志输出、打印、调试等情况。而 __repr__ 方法返回对象的“开发者级别”字符串表示,主要用于输出更详细、更精确的信息以便开发者理解和调试。
下面我们来分别定义一个类的 __str__ 和 __repr__ 方法,以演示这两个方法的不同:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'Person(name={self.name}, age={self.age})'
def __repr__(self):
return f'Person(name={self.name!r}, age={self.age!r})'
2. __str__ 和 __repr__ 方法的区别
2.1 __str__ 方法的应用
我们先看一下 __str__ 方法的应用,它可以让我们以更可读性高、更方便日志输出的方式来打印类的实例。
下面我们创建一个 Person 对象,并打印该对象:
person = Person('Bob', 24)
print(person)
输出结果为:
Person(name=Bob, age=24)
我们可以看到,输出结果比默认的对象内存地址更有意义,而且更容易阅读和理解。
2.2 __repr__ 方法的应用
__repr__ 方法的应用相较于 __str__ 方法更加重要,它可以输出对象的详细信息,对于调试和错误定位非常的有用。
下面我们来演示一下 __repr__ 方法的应用:
person = Person('Bob', 24)
print(repr(person))
输出结果为:
Person(name='Bob', age=24)
我们可以看到,输出结果更加精确、更加详细,包括了每个属性的具体值,这对于开发者来说可以更加方便地调试。
3. __str__ 和 __repr__ 方法的差异
以上已经介绍了 __str__ 和 __repr__ 方法的应用,那么这两个方法的区别在哪里呢?
3.1 __str__ 方法与 __repr__ 方法返回值的区别
我们已经知道,__str__ 和 __repr__ 方法都可以自定义对象的字符串表示,那么它们的区别在于字符串的职责不同。__str__ 应该返回一些简洁的对象描述,可读性较好,适合打印输出等展示性质的场合,而 __repr__ 方法应该返回一个完整的表达式,用于创建该对象的准确语法表示,其主要目的是调试。
3.2 __str__ 和 __repr__ 方法的调用
在一些特定的情况下,Python 在找到 __str__ 方法的情况下,也会使用 __repr__ 方法来替代其返回值。
比如说,如果我们访问一个对象的属性,但是这个属性不存在的时候,会输出该对象的 __repr__ 方法的返回值。
person = Person('Bob', 24)
print(person.namex)
输出结果为:
Person(name='Bob', age=24)
还有一个特别的情况,如果 __str__ 方法没有被实现或者返回一个空字符串,则会使用 __repr__ 方法替代其返回值。
class Test:
pass
t = Test()
print(str(t))
输出结果为:
<__main__.Test object at 0x000001DD6F06BF70>
但是如果将程序改为如下形式,输出结果就会变成 __repr__ 方法的返回值:
class Test:
def __repr__(self):
return 'I am Test'
t = Test()
print(str(t))
输出结果为:
I am Test
4.结论
__str__ 方法和 __repr__ 方法都是 Python 中用来定制输出信息的方法,__repr__ 方法输出的信息更加完整、精准,主要用于调试、错误定位等开发场景,而 __str__ 方法更加简洁、可读性好,主要用于展示性质的场合,如直接打印和日志输出等。