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_ _方法
     


  • 相关阅读:
    IntelliJ IDEA错误: 源值1.5已过时,将在未来所有版本中删除
    AcWing 311. 月之谜 数位dp
    AcWing 306. 杰拉尔德和巨型象棋 计数类DP
    AcWing 296. 清理班次2 线段树优化dp
    luogu P3052 [USACO12MAR]Cows in a Skyscraper G
    luogu P5664 Emiya 家今天的饭 容斥+dp
    AcWing 289. 环路运输 滑动窗口单调队列优化
    AcWing 288. 休息时间 滚动数组+分类讨论
    AcWing 287. 积蓄程度 树形dp,换根
    luogu P3842 [TJOI2007]线段 线性dp
  • 原文地址:https://www.cnblogs.com/chenyibai/p/9403920.html
Copyright © 2011-2022 走看看