测开之《__repr__和__str__方法的使用》

文章总览图

98d1c9ad7d051057ce4f27e0a9fb99d9.png

使用str函数或者print打印对象时会优先触发str方法,没定义str方法的情况下,会再去找repr方法,如果都没有,那么就会去找父类的str方法。

如果父类没有str方法,会找父类的repr方法,如果继承object的话,object里面肯定有str方法的。除非是继承一个自己定义的类。

在交互环境下输入对象和直接通过repr这个内置函数处理对象的时候,它只会触发repr方法,如果repr方法不存在,会找父类的repr方法,不会去找str方法。

repr方法是str方法的备胎。但是repr方法不能拿str方法做备胎。父类是第二轮备胎。

一、__str__方法

通过print打印的时候,str被触发了。通过str函数调用的时候,str也被触发了。

f05bcd540346d29a6603b1e00e2b3291.png

用内置函数format把这个对象传进去。它也能触发。

2179d27a98f831561206cc62f3658a95.png

这个print(m)打印出来它返回的内容。

56034a75dfd30fd1a39456b9256a47c6.png

str方法通过3种情况会被触发:

1.通过print去打印,2.通过str这个内置函数去处理它的时候就把它转换成字符串,转换成字符串,这个return self.name地方返回的就是个字符串。str返回的必须是字符串。

3.通过format格式化内置函数处理的时候同样也会触发。

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


    def __str__(self):
        print("---str--触发了--")
        return self.name

    def __repr__(self):
        print("__repr__被触发")
        print("hahaha")

m=MyClass("清菡")
print(m)
str(m)
format(m)

二、__repr__方法

repr方法除了在交互环境下会被触发,还有一种情况会被触发。

bb4962a6c49deb41dbd8458283081466.png

报错了,提示repr返回的不是个字符串,是个None。必须返回字符串。

0eab96a8b78370de32d2cd7a87d7c866.png d365245347f69e00cac3b80cd1a0ddbf.png

假设没写这2个方法的时候,返回的是个对象:

d33b3de676165f75fb63be764c02cd0d.png

如果自己没写,默认用的是object的str方法,看源码:

7feedbc5059e27f824c63491d5850b0d.png

那么这里返回的就是这个对象。

print打印是由str方法决定的,交互环境下是由repr方法决定的。

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


    # def __str__(self):
    #     print("---str--触发了--")
    #     return self.name
    #
    # def __repr__(self):
    #     print("__repr__被触发")
    #     return '<myClass.object-{}'.format(self.name)

m=MyClass("清菡")
# print(m)
# str(m)
# format(m)
res=repr(m)
print(res)

如果str方法不存在,会去触发repr方法,打印出repr方法的内容:

9c0369488da45082b59ceeeff82142e6.png

三、什么使用str方法,什么时候用repr方法?

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


    def __str__(self):
        print("---str--触发了--")
        return self.name

    def __repr__(self):
        print("__repr__被触发")
        return '<myClass.object-{}'.format(self.name)

m=MyClass("清菡")
print(m)
# str(m)
# format(m)
res=repr(m)
print(res)
32b730d998a7d3a55eaed1e97d03811f.png

str和repr方法都是返回字符串。在str方法里面返回的是字符串,直观的描述信息。

str方法返回内容是给用户看的,返回是直接的描述信息。

repr返回的东西是给程序员看的。程序员能看到是哪个类出来的对象,知道最开始的样子。


清菡软件测试,腾讯云年度最佳作者,非著名软件测试工程师。

02af28daa10ca1226a1687ff98aeba4e.png

公众号 「清菡软件测试」 首发,更多原创文章:清菡软件测试 143+ 原创文章,欢迎关注、交流,禁止第三方擅自转载。如有转载,请标明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清菡软件测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值