在Python中理解repr()函数的默认行为和用法
repr()函数是Python的内置函数之一,用于返回一个对象的字符串表示形式。它的默认行为是返回一个能够用于重新创建该对象的表达式字符串,即返回一个对象的可打印形式。
默认情况下,repr()会调用对象的__repr__()方法,如果该方法未实现,则会调用__str__()方法。如果都没有实现,则会返回一个类似"<__main__.ClassName object at 0x12345678>"的字符串,其中ClassName为对象的类名,0x12345678是对象在内存中的地址。
下面通过一个例子来进一步说明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})'
def __str__(self):
return f'{self.name} is {self.age} years old'
p = Person('Alice', 25)
print(repr(p)) # 输出:Person(name=Alice, age=25)
print(str(p)) # 输出:Alice is 25 years old
在上述代码中,创建了一个Person类,并在该类中实现了__repr__()和__str__()方法。__repr__()方法返回了一个格式化的字符串,用于重新创建该对象。__str__()方法返回了一个可读性更好的字符串,用于打印对象。
在使用repr()函数时,会直接调用对象的__repr__()方法,因此输出结果为:Person(name=Alice, age=25)。而使用str()函数时,会调用对象的__str__()方法,因此输出结果为:Alice is 25 years old。
需要注意的是,repr()函数返回的字符串应该是一个有效的Python表达式。如果返回的字符串无法被解析为一个有效的Python表达式,则可能会导致SyntaxError。
除了默认行为外,repr()函数还可以接受一个可选参数,用于指定对象的字符串表示形式。该参数传递给对象的__repr__()或__str__()方法,根据传入的参数不同,会调用相应的方法。
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})'
p = Point(3, 4)
print(repr(p)) # 输出:Point(x=3, y=4)
print(repr(p, precision=2)) # TypeError: repr() takes exactly one argument (2 given)
在上述代码中,定义了一个Point类,并实现了__repr__()方法。在调用repr()函数时,只能传递一个参数,因此传递多个参数会导致TypeError。
