__Str__和__repr__有什么区别?

1. __str__和__repr__的作用

在Python中,__str____repr__都是用于控制对象的字符串表示方式的特殊方法。它们可以让我们通过打印对象或将对象转换为字符串时,以我们期望的方式显示对象的内容。

__str__方法主要是为了提供人类可读的字符串表示,而__repr__方法则主要用于调试和开发,提供一个准确、详细且具有可读性的字符串表示。

2. __str__和__repr__的区别

2.1 __str__

__str__方法的作用是返回一个人类可读的字符串,用于展示对象的内容。当我们使用str()函数或打印一个对象时,实际上是调用了该对象的__str__方法。下面是一个简单的示例:

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})"

person = Person("Alice", 25)

print(person)

在上面的示例中,__str__方法返回了一个格式化过的字符串,通过print(person)语句可以打印出对象的内容,输出结果为:Person(name='Alice', age=25)。

值得注意的是,__str__方法应该返回一个字符串,否则会引发TypeError异常。

2.2 __repr__

__repr__方法的作用是返回一个准确且具有可读性的字符串,用于显示对象的详细信息,主要用于调试和开发的目的。当我们使用repr()函数或交互式地输入一个对象时,实际上是调用了该对象的__repr__方法。下面是一个示例:

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

def __repr__(self):

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

person = Person("Alice", 25)

print(repr(person))

在上面的示例中,__repr__方法返回的字符串与__str__方法返回的字符串类似,但它更加详细和准确。通过print(repr(person))语句可以打印出对象的详细信息,输出结果为:Person(name='Alice', age=25)。

__str__方法类似,__repr__方法也应该返回一个字符串,否则会引发TypeError异常。

3. 使用场景

3.1 打印对象

当我们直接打印一个对象时,实际上是调用了对象的__str__方法。这时我们可以通过实现__str__方法来控制对象的打印输出,使其更加人类可读。例如:

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})"

person = Person("Alice", 25)

print(person)

输出结果为:Person(name='Alice', age=25)。

3.2 调试和开发

当我们需要查看对象的详细信息以便调试和开发时,可以使用repr()函数来获取对象的详细字符串表示。这时我们可以通过实现__repr__方法来控制对象的详细字符串输出。例如:

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

def __repr__(self):

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

person = Person("Alice", 25)

print(repr(person))

输出结果为:Person(name='Alice', age=25)。

4. 总结

__str____repr__都是用于控制对象的字符串表示方式的特殊方法。它们之间的区别在于__str__方法返回一个人类可读的字符串,主要用于打印对象和展示对象内容,而__repr__方法返回一个准确、详细且具有可读性的字符串,主要用于调试和开发。

在开发中,我们可以根据实际情况选择实现__str__方法、__repr__方法或两者都实现,以便更好地满足不同的需求。

后端开发标签