说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 中,__repr__
是一个特殊方法(也称为魔术方法或者魔法方法),用于定义对象的“官方”字符串表示形式。它的作用是返回一个字符串,该字符串可以用来表示对象的状态或者内容,通常用于调试和日志记录。
实现 object.__repr__(self)
,当我们在交互式环境中输入一个对象名并按回车时,解释器会调用该对象的 __repr__
方法,以便显示对象的信息。如果没有定义 __repr__
方法,Python 将尝试调用 __str__
方法。如果 __str__
也未定义,Python 将返回默认的对象表示形式,类似 <__main__.ClassName object at 0x12345678>
。
由 repr() 内置函数调用以输出一个对象的“官方”字符串表示。如果可能,这应类似一个有效的 Python 表达式,能被用来重建具有相同取值的对象(只要有适当的环境)。如果这不可能,则应返回形式如 <...some useful description...>
的字符串。返回值必须是一个字符串对象。如果一个类定义了 __repr__()
但未定义 __str__()
,则在需要该类的实例的“非正式”字符串表示时也会使用 __repr__()
。
此方法通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的。
以下是一个简单的示例,说明了如何定义和使用 __repr__
方法:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Point(x={self.x}, y={self.y})"
# 创建一个 Point 对象
p = Point(3, 4)
# 打印对象
print(p) # 输出:Point(x=3, y=4)
在这个示例中,我们定义了一个 Point 类,它有两个属性 x 和 y。我们在类中实现了 __repr__
方法,返回了一个字符串,用于表示该对象的状态。当我们打印 Point 对象时,Python 将调用该方法并显示返回的字符串表示形式。
总之,__repr__
方法允许我们自定义对象的字符串表示形式,以便更好地理解和调试代码。
__repr__
和 eval()
重建对象通过 eval()
重建对象是 __repr__
方法的一个常见用途。eval()
函数会将字符串作为 Python 表达式执行,并返回表达式的结果。如果你为类实现了一个合理的 __repr__
方法,使得其返回的字符串能够准确地重建对象,那么你就可以利用 eval()
来创建一个与原对象相同的新对象。
假设我们有一个 Person
类,它包含姓名和年龄属性。我们希望通过 __repr__
返回一个可以用 eval()
重建该对象的字符串。
实现 __repr__
方法:
在 __repr__
方法中,我们返回一个字符串,该字符串是一个合法的 Python 表达式,可以通过 eval()
来重新创建该对象。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
# 返回可以通过 eval() 重建对象的字符串
return f"Person('{self.name}', {self.age})"
def __str__(self):
return f"Person: {self.name}, {self.age} years old"
# 创建一个 Person 实例
person = Person("Alice", 30)
# 使用 repr() 获取字符串表示
repr_str = repr(person)
print(repr_str) # 输出: Person('Alice', 30)
# 使用 eval() 重建对象
new_person = eval(repr_str)
print(new_person) # 输出: Person: Alice, 30 years old
解释代码:
Person
类的 __repr__
方法返回一个字符串 Person('{self.name}', {self.age})
,这实际上是一个有效的 Python 表达式,创建了一个 Person
对象。repr(person)
时,它返回 Person('Alice', 30)
这样的字符串。eval(repr_str)
,我们将字符串传递给 eval()
,它会执行该字符串,并返回创建的新 Person
对象。通过 eval()
重建对象:
new_person = eval(repr_str) # 通过 eval() 执行字符串,重建对象
print(new_person) # 输出: Person: Alice, 30 years old
new_person
是通过 eval()
执行 repr_str
之后返回的对象,它与原始的 person
对象完全相同。
注意事项:
eval()
时需要小心,因为它会执行传入的字符串内容。如果字符串来源不可信,可能会执行恶意代码。在处理外部输入时,应该避免直接使用 eval()
。__repr__
时的考虑: 为了使 eval()
能够重建对象,__repr__
必须返回一个包含必要构造对象的信息的字符串。如果类构造函数需要更多参数或者依赖于外部信息,可能需要在 __repr__
中提供足够的细节。__repr__
和 __str__
特殊方法的区别https://docs.python.org/zh-cn/3/reference/datamodel.html#object.__repr__
更新时间:2024-12-03 08:24:02 标签:python 特殊方法 字符串