Python中__str__函数和__repr__函数的区别

175 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

引言

当我们python中定义一个类时,常用__str__以及__repr__函数输出这个类的具体描述,但这两个函数具体又有些什么区别呢?一句话总结的话:__repr__比__str__的使用要求更加严格,优先级更低。

优先级比较

 首先__repr__和__str__在判定优先级上有所区别,当我们在类中同时定义__repr__和__str__方法时,并不会先后输出对应内容,而是有选择性的输出其中一个,验证如下:

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

    def __str__(self):
        print("这是一个__str__函数")
        return self.name
    def __repr__(self):
        print("这是一个__repr__函数")
        return self.name
def main():
    fun=My_func('doge')
    print(fun)
if __name__=='__main__':
    main()

运行结果:

这是一个__str__函数
doge

从上面可以看出,当使用print()输出类的描述时,会优先寻找__str__函数的解释,覆盖掉__repq__的描述,即__str__的优先级要高于__repq__。

使用要求比较

 __repr__和__str__除了在优先级上,还在使用要求上有所区分。

无str

class My_func (object):
    def __init__(self,name):
        self.name=name
    def __repr__(self):
        print("这是一个__repr__函数")
        return self.name
def main():
    fun=My_func('doge')
    print(str(fun))
if __name__=='__main__':
    main()

运行结果:

这是一个__repr__函数
doge

如上所示,当类方法中没有定义__str__时,调用str()函数并不会输出默认的地址值,而是会调用存在的__repr__函数。

无repr

class My_func (object):
    def __init__(self,name):
        self.name=name
    def __str__(self):
        print("这是一个__str__函数")
        return self.name
def main():
    fun=My_func('doge')
    print(repr(fun))
if __name__=='__main__':
    main()

结果:

<__main__.My_func object at 0x000001F1E4072518>

当类中并没有定义__repr__时,不会再调用__str__,而是会直接输出默认值即内存中的地址。从而可以看出实际使用时__repr__会作为__str__的下位替代,若类中不包含__str__方法,则会使用__repr__作为替代,反之则不会发生。

另:这两个函数的return值都应该是字符,不能return一个整型或其他值。