看例子
>>> class A:
... def __repr__(self):
... return 'hello world'
...
>>> a=A()
>>> a # 不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了
hello world
>>> print(a) # 等同于print(str(a))
hello world
>>> class B:
... def __str__(self):
... return 'hello world'
...
>>> b=B()
>>> b # 你会发现,直接输出对象b时并没有按我们__str__方法中定义的格式进行输出
<__main__.B object at 0x00000000027553C8>
>>> print(b) # 而用print输出的信息却改变了,等同于print(str(b))
hello world
>>>__repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员 (机器)
__str__ 方法其实调用了 __repr__ 方法。
调用 print(b) (#等同与print(str(b)))的时候,解释器第一个寻找的就是B这个类的方法里面有没有重新定义str,如果没有,那么它第二步会去寻找这个类里面有没有重新定义repr,如果有则会用类方法的repr,如果还没有,那么解释器会找这个类的上一层父类,按同样的规则进行寻找,直到最后找到了object,然后用object的str方法,将该对象的内容转成字符串,最后输出到终端。
调用print(repr(a))的时候就不一样了,repr只会调用repr方法,当自定义的类中没有重写repr方法的时候,它会直接找上一级的父类中有没有repr方法,而不会考虑调用str方法。





Comments | NOTHING