• Python中__repr__和__str__区别(转)


    class Test(object):
        def __init__(self, value='hello, world!'):
            self.data = value
    
    >>> t = Test()
    >>> t
    <__main__.Test at 0x7fa91c307190>
    >>> print t
    <__main__.Test object at 0x7fa91c307190>
    
    # 看到了么?上面打印类对象并不是很友好,显示的是对象的内存地址
    # 下面我们重构下该类的__repr__以及__str__,看看它们俩有啥区别
    
    # 重构__repr__
    class TestRepr(Test):
    #控制打印对象时,打印的到底是什么
    def __repr__(self): return 'TestRepr(%s)' % self.data >>> tr = TestRepr() >>> tr TestRepr(hello, world!) >>> print tr TestRepr(hello, world!) # 重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了 # 重构__str__ calss TestStr(Test): def __str__(self): return '[Value: %s]' % self.data >>> ts = TestStr() >>> ts <__main__.TestStr at 0x7fa91c314e50> >>> print ts [Value: hello, world!] # 你会发现,直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了 接!

    __repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员。

    打印操作会首先尝试__str__和str()内置函数(print运行的内部等价形式),它通常应该返回一个友好的显示。

    __repr__用于所有其他的环境中:用于交互模式下提示回应以及repr函数,如果没有使用__str__,会使用print和str(仍存在疑问)。它通常应该返回一个编码字符串,可以用来重新创建对象,或者给开发者详细的显示。

    当我们想所有环境下都统一显示的话,可以重构__repr__方法;当我们想在不同环境下支持不同的显示,例如终端用户显示使用__str__,而程序员在开发期间则使用底层的__repr__来显示,实际上__str__只是覆盖了__repr__以得到更友好的用户显示。
    ---------------------
    作者:Tab609
    来源:CSDN
    原文:https://blog.csdn.net/luckytanggu/article/details/53649156
    版权声明:本文为博主原创文章,转载请附上博文链接!

    一个百度知道上的知识:python __repr__的作用(这里是__repr__属性)
    >>> int.__repr__
    <slot wrapper '__repr__' of 'int' objects>
    这个函数,对应repr(object)(这里是最原始的repr功能,上面那篇博客指的是重构repr)这个功能。意思是当需要显示一个对象在屏幕上时,将这个对象的属性或者是方法整理成一个可以打印输出的格式。

    这个功能与eval()也可以对应。打印出的结果直接放到eval里,通常可以获得原来的对象。
    比如t1=datetime.datetime.now()
    print repr(t1)
    结果是
    datetime.datetime(2014, 9, 9, 6, 34, 29, 756000)

    与此相类似的功能是__str__
    比如你有一个People类,当打印时你只希望它打印出人名,那么你可以在__str__函数里写上return self.name , 这样当需要People当作一个字符串时,返回的就是人名。
    你使用 print str(t1)时结果是
    2014-09-09 06:34:29.756000
    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 133 克隆图
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/10360114.html
Copyright © 2020-2023  润新知