zoukankan      html  css  js  c++  java
  • __str_方法和__repr__的区别

    __str__方法和__repr__方法:

    官方文档解释:

      Object.__repr__(self):

      由 repr() 内置函数调用以输出一个对象的“官方”字符串表示。如果可能,这应类似一个有效的 Python 表达式,

    能被用来重建具有相同取值的对象(只要有适当的环境)。如果这不可能,则应返回形式如 <...some useful description...> 的字符串。

    返回值必须是一个字符串对象。如果一个类定义了 __repr__() 但未定义 __str__(),则在需要该类的实例的“非正式”字符串表示时也会使用 __repr__()。

      此方法通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的

      Object.__str__(self):

      通过 str(object) 以及内置函数 format() 和 print() 调用以生成一个对象的“非正式”或格式良好的字符串表示。返回值必须为一个 字符串 对象。

    此方法与 object.__repr__() 的不同点在于 __str__() 并不预期返回一个有效的 Python 表达式:可以使用更方便或更准确的描述信息。

    内置类型 object 所定义的默认实现会用 object.__repr__()。

     

    1.首先,我们在print任何东西的时候都有一个渲染的过程,如果他的类里没有重写(定义)__str__和__repr__,但是在父类object里已经定义了__str__和__repr__方法,

    而内置类型object所定义的默认实现会用__repr__(),返回他的内存地址。当然,这时的__repr__方法和__str__方法的返回值是一样的,都是实例在内存中的地址。

    class Word(object):
    def __init__(self):
    self.color = 'green'

    a = Word()
    print(a)
    print(a.__str__())
    print(a.__repr__())

    <__main__.Word object at 0x100815910>
    <__main__.Word object at 0x100815910>
    <__main__.Word object at 0x100815910>

    2.两种方式单独存在的情况下,都是返回的字符串,调用的就是重写的方法:

    如果重写__str__而不重写__repr__,实例对象调用的就是__str__方法,使用__repr__方法返回的还是内存地址:

    class Word(object):
    def __init__(self):
    self.color = 'green'

    def __str__(self):
    print('类正在调用__str__方法')
    return '__str__'
    a = Word()
    print(a)
    print(a.__str__())
    print(a.__repr__())
    结果:

    类正在调用__str__方法
    __str__
    类正在调用__str__方法
    __str__
    <__main__.Word object at 0x1010dfd10>

     

    但是如果重写了__repr__方法的话,实例对象调用的就是__repr__方法,而__str__方式实际上会调用__repr__方法:

    class Word(object):
    def __init__(self):
    self.color = 'green'

    def __repr__(self):
    print('类正在调用__repr__方法')
    return '%s'%self.color
    a = Word()
    print(a)
    print(a.__str__())
    print(a.__repr__())

    类正在调用__repr__方法
    green
    类正在调用__repr__方法
    green
    类正在调用__repr__方法
    green

    3,当两种方法都重写时,类会调用__str__方法:

    class Word(object):
    def __init__(self):
    self.color = 'green'

    def __str__(self):
    print('类正在调用__str__方法')
    return '__str__'

    def __repr__(self):
    print('类正在调用__repr__方法')
    return '%s'%self.color
    a = Word()
    print(a)
    print(a.__str__())
    print(a.__repr__())

    类正在调用__str__方法
    __str__
    类正在调用__str__方法
    __str__
    类正在调用__repr__方法
    green

    总结:

      1.我们可以使用 __str__ 和 __repr__ 方法定义类到字符串的转化方式,而不需要手动打印某些属性或是添加额外的方法。

      2.一般来说,__str__ 的返回结果在于强可读性,而 __repr__ 的返回结果在于准确性。

      3.我们至少需要添加一个 __repr__ 方法来保证类到字符串的自定义转化的有效性,__str__ 是可选的。因为默认情况下,在需要却找不到 __str__ 方法的时候,会自动调用 __repr__ 方法。

     

     

     

     

      

  • 相关阅读:
    2019年10月31日 万能异常
    2019年10月29日 异常处理
    2019年10月26日 复习
    爬虫时如何使用代理服务器
    爬虫时url中http和https的区别
    博客园如何自定义博客皮肤和主题
    Python发送QQ邮件
    Python中的XML
    持久化-pickle和shelve
    open()函数提示找不到file的解决办法
  • 原文地址:https://www.cnblogs.com/Jokerguigui/p/11520100.html
Copyright © 2011-2022 走看看