python:改变对象的描述信息

本文深入探讨了Python中__str__和__repr__方法的区别与应用,通过实例展示了如何自定义对象的字符串表示形式,以增强调试信息的可读性和实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

讨论

# -*- coding=utf-8 -*-


class Hello:
    def __init__(self):
        print("Initialize a object!")


if __name__ == "__main__":
    hello = Hello()
    print(hello)

运行结果:

Initialize a object!
<__main__.Hello object at 0x000002E14CBD95C8>

hello对象的输出信息显示的是:hello对象是Hello类的对象,hello对象的内存地址。

如果我想改变hello对象的显示输出,让他更具可读性,或者添加一些信息来简化调试,该怎么做呢?

可以重新定义它的 __str__()方法和__repr__()方法。

使用__repr__()方法:

# -*- coding=utf-8 -*-


class Hello:
    def __init__(self):
        print("Initialize a object!")

    def __repr__(self):
        return "Hello 类的实例"


if __name__ == "__main__":
    hello = Hello()
    print(hello)

运行结果:

Initialize a object!
Hello 类的实例

使用__str__()方法:

# -*- coding=utf-8 -*-


class Hello:
    def __init__(self):
        print("Initialize a object!")

    def __str__(self):
        return "Hello 类的实例"


if __name__ == "__main__":
    hello = Hello()
    print(hello)

运行结果:

Initialize a object!
Hello 类的实例

从上面的使用中,貌似__str__()和__repr__()没有什么区别,不,其实是有区别的。

# -*- coding=utf-8 -*-


class Hello:
    def __init__(self):
        print("Initialize a object!")

    def __str__(self):
        return "__str__:Hello 类的实例"
    
    def __repr__(self):
        return "__repr__:Hello 类的实例"


if __name__ == "__main__":
    hello = Hello()
    print(hello)

运行结果:

Initialize a object!
__str__:Hello 类的实例

如果同时出现__str__()和__repr__()方法,优先使用__str__()方法。

如果没有定义__str__(),会使用__repr__()来代替输出;

如果__repr__()也没有定义,看到的就是默认的对象信息:<main.Hello object at 0x000002E14CBD95C8>。

当然,在两种方法都有定义的情况下,可以使用==!r==格式化代码来指定使用__repr__()输出,替换掉默认的__str__()方法。

# -*- coding=utf-8 -*-


class Hello:
    def __init__(self):
        print("Initialize a object!")

    def __str__(self):
        return "__str__:Hello 类的实例"

    def __repr__(self):
        return "__repr__:Hello 类的实例"


if __name__ == "__main__":
    hello = Hello()
    print("{0!r}".format(hello)) # 这里使用!r格式化代码指定用__repr__()输出对象信息

运行结果:

Initialize a object!
__repr__:Hello 类的实例

总结

自定义__str__()和__repr__()方法是个好习惯,他可以简化调试和实例输出。

上面的输出只是验证用的,真实的输出信息应该更有用些,比如:

f = open("game.py")
print(f)

运行结果:

<_io.TextIOWrapper name='game.py' mode='r' encoding='cp936'>

遵循规范,我们给输出信息最好也要加上 < 和 > 。

息应该更有用些,比如:

f = open("game.py")
print(f)

运行结果:

<_io.TextIOWrapper name='game.py' mode='r' encoding='cp936'>

遵循规范,我们给输出信息最好也要加上 < 和 > 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值