欢迎访问宙启技术站
智能推送

Python中如何定制对象的repr()函数和str()函数的返回值

发布时间:2024-01-06 00:32:21

在Python中,可以通过定义特殊方法来定制对象的repr()函数和str()函数的返回值。这些特殊方法包括__repr__()__str__()

__repr__()方法用于返回对象的“官方”字符串表示形式,它应该是一个可以用eval()函数重新创建对象的表达式。一般来说,它应该返回一个字符串,以便在解释器输入中打印出来,或者在repr()函数中使用。

下面是一个示例,定义了一个Point类,包含xy两个坐标属性。通过覆盖__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()函数返回的是一个更友好的字符串表示形式,供最终用户查看。根据应用场景的不同,可以根据需要选择要覆盖的方法。