一、工作原理和区别
__str__返回一个字符串,表示对象的可读性好的字符串,在打印对象时被调用(触发),可通过内置函数str(类对象)和print(类对象)触发。
__repr__也返回一个字符串,表示对象的代码形式,它在交互式环境和调试器中使用,并且可以通过内置函数
repr()
调用(触发)。总之,
__str__
和__repr__
是非常有用的 Python 魔法方法,可以让你更好地控制对象如何在字符串中表示,以便于程序员进行调试和开发。
二、__str__代码示例
打印一样,print(b)和str(b)实际上触发了底层的__str__,表示了对象的信息
class test(): pass b = test() print(b) # <__main__.test object at 0x106d975f8> print(str(b)) # <__main__.test object at 0x106d975f8>
三、__repr__代码示例
class test(): def __repr__(self): print('__repr__我被调用了') return 'repr---------' b = test() print(repr(b)) b # 不会触发__repr__,需要在交互式或调试环境下才会触发,所以这种情况下只有repr()内置函数触发
str(b) # 优先触发__str__,如果没有定义,那么会触发__repr__(print(b)若没有__str__也会触发__repr__)
结果:
__repr__我被调用了
repr---------
四、综合示例
class Car: def __init__(self, make, model, year): self.make = make self.model = model self.year = year def __str__(self): return f"{self.make} {self.model} ({self.year})" def __repr__(self): return f"Car('{self.make}', '{self.model}', {self.year})" # 创建一个 Car 实例并尝试打印它,__str__ 方法将被调用 c = Car('Toyota', 'Corolla', 2020) print(c) # 输出: Toyota Corolla (2020) # 如果我们在交互式环境中输入 c,则会调用 __repr__ 方法 c # 输出: Car('Toyota', 'Corolla', 2020)
五、补充python内置函数repr()
当我们需要查看一个对象的字符串表示时,可以使用内置函数 repr()
。它会返回一个包含对象信息的字符串,通常用于调试和打印输出。
有时候我们需要看到对象中的元素,而不是整个对象,使用repr()内置函数,实际上是调用了底层的__repr__魔法方法,来获取该对象的字符串表示形式。
x = [1, 2, 3] print(repr(x)) # [1, 2, 3] print(type(repr(x))) # str
那我们思考一下,print打印实际上就是调用了底层的__str__魔法方法。