关于__str__ 和 __repr__方法的用法和区别

  之前在学习python的时候,经常会在class(类)中遇到__str__方法,这个当时查了一下,发现这个方法是为了打印类的属性而出现的,通常对于实例化的类,如果直接对其进行打印,那么输出打印的将会是这个对象的类型和对象所在的地址。事实上,我们的本意往往是想了解该对象的基本信息,例如该对象有哪些属性,它们的值各是多少等等。但默认情况下,我们得到的信息只会是“类名+object at+内存地址”,对我们了解该实例化对象帮助不大。那么,有没有可能自定义输出实例化对象时的信息呢?答案是肯定,通过重写类的 __repr__() 方法即可。事实上,当我们输出某个实例化对象时,其调用的就是该对象的 __repr__() 方法,输出的是该方法的返回值。比如下面的例子:

class A(object):
    def __init__(self, name):
    self._name = name
def main(): a = A('独步前行') print(a) if __name__ == '__main__': main()

  这里我们的本意是打印A的属性name,但是在实际操作的过程中,编译器会输出类名+object at 内存地址,上面的输出如下

#<__main__.A object at 0x0000025B7A3665F8>

  如果想要打印属性值,就必须调用__str__方法,这样具体的属性值才会被打印出来,具体的代码如下:

class A(object):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return '%s' % self.name
def main():
    a = A('独步前行')
    print(a)


if __name__ == '__main__':
    main()

  这样打印出来的实例化的类才会是我们所需要的属性值,但是需要注意的是,__str__()方法和__repr__()方法的返回值只能是字符串!上面代码的执行结果显示如下:

#独步前行

__repr__: 是__str__的备胎.如果有__str__方法,那么# print %s str都先去执行__str__方法,并且使用__str__的返回值

# 如果没有__str__,那么 print %s str都会执行repr
# repr(obj),%r

在子类中使用__str__,先找子类的__str__,没有的话要向上找,只要父类不是object,就执行父类的__str__
但是如果除了object之外的父类都没有__str__方法,就执行子类的__repr__方法,如果子类也没有,
还要向上继续找父类中的__repr__方法.
一直找不到 再执行object类中的__str__方法,现实使用中,可以运用下面的代码来使用__repr__

def __repr__(self):
    return self.__str__()

关于调用两种方法的时机

  • 使用print()时
  • 使用%sf'{}'拼接对象时
  • 使用str(x)转换对象x时

在上述三种场景中,会优先调用对象的__str__()方法;若没有,就调用__repr__()方法;若再没有,则显示其内存地址。

特别地,对于下面两种场景:

  • %r进行字符串拼接时
  • repr(x)转换对象x时

则会调用这个对象的__repr__()方法;若没有,则不再看其是否有__str__()方法,而是显示其内存地址。

猜你喜欢

转载自www.cnblogs.com/dubuqianxing-gyt/p/12186683.html