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


原文地址:https://www.cnblogs.com/chenyibai/p/9403920.html