Python中str()与repr()、__str__()与__repr__()的区别

带双下划线不带双下划线 的区别

带双下划线,属于方法的定义;一般定义在类里面。
不带双下划线,属于方法的调用;调用时传入一个对象,返回对象相关描述信息。
先有定义,然后有调用。

__str__()、__repr__()区别

讲真的,就我感觉这两个方法差别不大,复写这两个方法后,可以重写一个对象的描述信息。
真要说他们的差别,就是他们被调用的顺序不同。

通过交互式命令看两个的调用顺序
ps: 前面没加 '>>>',大家知道就行

一、当这两个方法都被复写时

class Man:
    def __init__(self, value):
        self.value = value
    def __repr__(self):
        return '__repr__(): {0}'.format(self.value)
    def __str__(self):
        return '__str__(): {0}'.format(self.value)

man1 = Man('test')

man1
__repr__(): test
str(man1)
'__str__(): test'
repr(man1)
'__repr__(): test'
print(man1)
__str__(): test
print(str(man1))
__str__(): test
print(repr(man1))
__repr__(): test
print('[1]: {0!r}'.format(man1))
[1]: __repr__(): test
print('[2]: {0!s}'.format(man1))
[2]: __str__(): test
print('[3]: {0!r}'.format(man1.value))
[3]: 'test'
print('[4]: {0}'.format(man1))
[4]: __str__(): test

"""
总结:
str(man1)、
print(man1)、print(str(man1))、
print('[2]: {0!s}'.format(man1))、
print('[4]: {0}'.format(man1)) 
是直接调用__str__()

man1、repr(man1)、
print(repr(man1))、print('[1]: {0!r}'.format(man1))
是直接调用__repr__()
"""

二、只有一个方法被复用

class Woman:
    def __init__(self, value):
        self.value = value
    def __repr__(self):
        return 'woman __repr__(): {0}'.format(self.value)
woman1 = Woman('test2')
woman1
woman __repr__(): test2
print(woman1)
woman __repr__(): test2
str(woman1)
'woman __repr__(): test2'
repr(woman1)
'woman __repr__(): test2'
print('{0!r}'.format(woman1))
woman __repr__(): test2
"""
总结:
当一个类里面只有__repr__()时,不管怎么打印,匀是调用__repr__()方法
"""

贴的测试代码多,解释少,这种东西,重在自己的理解。自己去悟,我写的这些只是引导。
加油,少年!

参考:

https://blog.csdn.net/qq_36272641/article/details/80875222
https://www.cnblogs.com/superxuezhazha/p/5746922.html

你可能感兴趣的:(Python中str()与repr()、__str__()与__repr__()的区别)