zoukankan      html  css  js  c++  java
  • __repr__浅析

     我们知道_ _str_ _: str(obj),要求必须实现了_ _str_ _要求这个方法的返回值必须是字符串str类型
    print %s str 全部依赖_ _str_ _

    而_ _repr_ _与_ _str_ _有着千世万缕的联系
    a="123"
    print(a)
    结果:123
    
    

    正常情况下打印a是经过了pycharm优化处理过的,看不到两端的 " "

    所以:

    a="123"
    print(repr(a))
    # 结果:'123'

    这样就可以显示原有的a

    class A:
        def __init__(self,name):
            self.name=name
    a=A("asdf")
    print(a)
    结果:<__main__.A object at 0x000001B8AF2A5EB8>
    
    
    class A:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return self.name
    a=A("asdf")
    print(a)
    结果:asdf
    
    
    class A:
        def __init__(self,name):
            self.name=name
        def __repr__(self):
            return self.name
    a=A("asdf")
    print(a)
    结果:asdf

    由上我们可以看出个问题,起初说print是依赖于_ _str_ _,而现在_ _repr_ _也可以执行,所以,我们就要探讨一下他们的联系了.

    class A:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return "**%s**" % self.name
        def __repr__(self):
            return self.name
    a=A("asdf")
    print(a)
    # 结果:**asdf**
    print(str(a),repr(a))
    # 结果:**asdf** asdf
    print("%s|%r" % (a,a))
    # 结果:**asdf**|asdf

    结论:_ _repr_ _对应的是repr(obj)和%r的用法

    class A:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return "**%s**" % self.name
    a=A("asdf")
    print(a)
    # 结果:**asdf**
    print(str(a),repr(a))
    # 结果:**asdf** <__main__.A object at 0x000002483E825EB8>
    print("%s|%r" % (a,a))
    # 结果:**asdf**|<__main__.A object at 0x000002483E825EB8>
    
    
    class A:
        def __init__(self,name):
            self.name=name
        def __repr__(self):
            return self.name
    a=A("asdf")
    print(a)
    # 结果:asdf
    print(str(a),repr(a))
    # 结果:asdf asdf
    print("%s|%r" % (a,a))
    # 结果:asdf asdf

    所以:我们存在的问题也就解决了.__repr__对于__str__来说相当于是个备胎,如果有__str__方法,那么,print %s str这些方法都先去执行__str__的方法,并且都先返回__str__的值.如果没有__str__方法,那么,所有的print %s str,repr(obj)和%r这些方法都会执行__repr__.

    那么,如果只能实现一个呢?

    __repr__较好.因为__repr__执行的方法多,成本低,效果好

    _ _str_ _和_ _repr_ _执行顺序又是怎么样的呢?
    class A:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return "**%s**" % self.name
        def __repr__(self):
            return self.name
    class B(A):
        def __init__(self,name):
            self.name=name
    a=B("asdf")
    print(a)
    # 结果:**asdf**
    print(str(a),repr(a))
    # 结果:**asdf** asdf
    print("%s|%r" % (a,a))
    # 结果:**asdf**| asdf
    
    
    class A:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return "**%s**" % self.name
        def __repr__(self):
            return self.name
    class B(A):
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return "******"
    a=B("asdf")
    print(a)
    # 结果:******
    print(str(a),repr(a))
    # 结果:****** asdf
    print("%s|%r" % (a,a))
    # 结果:******|asdf
    
    用自己的str方法,用父类的repr方法
    
    
    
    class A:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return "**%s**" % self.name
        def __repr__(self):
            return self.name
    class B(A):
        def __init__(self,name):
            self.name=name
        def __repr__(self):
            return "******"
    a=B("asdf")
    print(a)
    # 结果:**asdf**
    print(str(a),repr(a))
    # 结果:**asdf** ******
    print("%s|%r" % (a,a))
    # 结果:**asdf**|******
    
    用父类的str,用自己的repr
    
    
    综上可得:
    在子类中使用_ _str_ _,先找子类的_ _str_ _,没有的话要向上找,只要父类不是object,就执行父类的_ _str_ _
    但是如果出了object之外的父类都没有_ _str_ _方法,就执行子类的_ _repr_ _方法,如果子类也没有,
    还要向上继续找父类中的_ _repr_ _方法.
    一直找不到 再执行object类中的_ _str_ _方法
     


  • 相关阅读:
    Windows下的免安装版MySQL配置
    spket插件安装并设置JQuery自动提示
    js生成条形码——JsBarcode
    金明的预算方案
    文化之旅
    方格取数
    天使的起誓
    最大差值
    A%B Problem
    取数游戏
  • 原文地址:https://www.cnblogs.com/chenyibai/p/9403920.html
Copyright © 2011-2022 走看看