(第四篇)__str__和__repr__

发布时间 2023-03-24 17:22:18作者: hechengQAQ

一、工作原理和区别

__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()内置函数触发

结果:
__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__魔法方法。