Python-类对象特殊方法__str__()、__repr__()

  1. 类对象特殊方法__str__()和__repr__()

类对象特殊方法__str__()__repr__()

用于自定义并返回实例对象的字符串表示形式

内置函数str()和repr()都返回对象的字符串表示,其区别在于:
str()的返回值是给用户看的,更加用户友好;
repr()的返回值是给程序开发看的,是为调试服务的;

1、当在交互式命令行中直接打印一个实例对象时

  • 如果在实例对象对应的类对象中实现了特殊方法__repr__(),会自动调用该方法;
  • 否则,会打印实例对象对应的类对象在内存中的地址。
>>> class MyClass(object):
...     pass
...
>>> mc = MyClass()
>>> mc
<__main__.MyClass object at 0x7f2c301f9470>
>>>
>>> print(mc)
<__main__.MyClass object at 0x7f2c301f9470>
>>>
>>> str(mc)
'<__main__.MyClass object at 0x7f2c301f9470>'
>>>
>>> repr(mc)
'<__main__.MyClass object at 0x7f2c301f9470>'

2、当调用内置函数print打印一个实例对象时

  • 如果在实例对象对应的类对象中实现了特殊方法__str__(),会自动调用__str__()方法;
  • 否则,如果在实例对象对应的类对象实现了特殊方法__repr__(),会自动调用__repr__()方法;
  • 否则,会打印实例对象对应的类对象在内存中的地址。
>>> class MyClass2(object):
...     def __str__(self):
...         return '__str__()被调用了'
...
>>> mc2 = MyClass2()
>>>
>>> mc2
<__main__.MyClass2 object at 0x7f2c301f95f8>
>>>
>>> print(mc2)
__str__()被调用了
>>>
>>> str(mc2)
'__str__()被调用了'
>>>
>>> repr(mc2)
'<__main__.MyClass2 object at 0x7f2c301f95f8>'

3、当调用内置函数str创建字符串,并且实参时一个实例对象时

  • 如果在实例对象的类对象中实现了特殊方法__str__(),在内置函数str的内部会自动调用__str__()方法;
  • 否则,如果在实例对象对应的类对象中实现了特殊方法__repr__(),在内置函数str的内部会自动调用__repr__()方法;
  • 否则,会打印实例对象对应的类对象和实例对象在内存中的地址
>>> class MyClass3(object):
...     def __repr__(self):
...         return '__repr__()被调用了'
...
>>> mc3 = MyClass3()
>>> mc3
__repr__()被调用了
>>>
>>> print(mc3)
__repr__()被调用了
>>>
>>> str(mc3)
'__repr__()被调用了'
>>>
>>> repr(mc3)
'__repr__()被调用了'

4、当调用内置函数repr创建字符串,并且实参时一个实例对象时

  • 如果在实例对象的类对象中实现了特殊方法__repr__(),在内置函数str的内部会自动调用__repr__()方法;
  • 否则,会打印实例对象对应的类对象和实例对象在内存中的地址
>>> class MyClass4(object):
...     def __str__(self):
...         return '__str__()被调用了'
...     def __repr__(self):
...         return '__repr__()被调用了'
...
>>> mc4 = MyClass4()
>>> mc4
__repr__()被调用了
>>>
>>> print(mc4)
__str__()被调用了
>>>
>>> str(mc4)
'__str__()被调用了'
>>>
>>> repr(mc4)
'__repr__()被调用了'

6c896575-d7bd-477a-898d-ebc2846b0b0d-image.png

通常__str__()__repr__()实现代码是一样的,因此我们可以将定义的其中一个的方法名赋值给另外一个方法名

#!/usr/bin/python3

class MyClass5(object):
    def __str__(self):
        return 'xxx'

    __repr__ = __str__

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com