Python中如何定制对象的repr()函数和str()函数的返回值
在Python中,可以通过定义特殊方法来定制对象的repr()函数和str()函数的返回值。这些特殊方法包括__repr__()和__str__()。
__repr__()方法用于返回对象的“官方”字符串表示形式,它应该是一个可以用eval()函数重新创建对象的表达式。一般来说,它应该返回一个字符串,以便在解释器输入中打印出来,或者在repr()函数中使用。
下面是一个示例,定义了一个Point类,包含x和y两个坐标属性。通过覆盖__repr__()方法,我们返回一个字符串表示当前Point对象的表达式。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Point({self.x}, {self.y})"
# 创建一个Point对象
p = Point(3, 5)
# 打印对象的repr()函数返回值
print(repr(p)) # 输出:Point(3, 5)
__str__()方法用于返回对象的“非正式”或“友好”字符串表示形式,它通常用于向最终用户显示对象。str()函数将会在对象不存在__str__()方法的情况下调用__repr__()方法。
继续以上面的Point类为例,我们定义一个__str__()方法,返回一个友好的字符串表示形式。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Point({self.x}, {self.y})"
def __str__(self):
return f"({self.x}, {self.y})"
# 创建一个Point对象
p = Point(3, 5)
# 打印对象的str()函数返回值
print(str(p)) # 输出:(3, 5)
在上述示例中,我们在Point类中同时定义了__repr__()和__str__()方法。当我们调用repr()函数时,它将返回__repr__()方法的返回值,即Point(3, 5);当我们调用str()函数时,它将返回__str__()方法的返回值,即(3, 5)。
需要注意的是,默认情况下,如果只覆盖其中一个方法,另一个方法会调用已覆盖的方法来返回结果。例如,在上述示例中,如果我们只是覆盖了__str__()方法而没有定义__repr__()方法,当我们调用repr()函数时,它会返回__str__()方法的返回值,即(3, 5)。
定制对象的repr()函数和str()函数可以使程序更易读,更易调试。repr()函数返回的是一个可以用来重新创建对象的表达式,而str()函数返回的是一个更友好的字符串表示形式,供最终用户查看。根据应用场景的不同,可以根据需要选择要覆盖的方法。
