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