文章总览图
使用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也被触发了。
用内置函数format把这个对象传进去。它也能触发。
这个print(m)打印出来它返回的内容。
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方法除了在交互环境下会被触发,还有一种情况会被触发。
报错了,提示repr返回的不是个字符串,是个None。必须返回字符串。
假设没写这2个方法的时候,返回的是个对象:
如果自己没写,默认用的是object的str方法,看源码:
那么这里返回的就是这个对象。
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方法的内容:
三、什么使用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方法都是返回字符串。在str方法里面返回的是字符串,直观的描述信息。
str方法返回内容是给用户看的,返回是直接的描述信息。
repr返回的东西是给程序员看的。程序员能看到是哪个类出来的对象,知道最开始的样子。
清菡软件测试,腾讯云年度最佳作者,非著名软件测试工程师。
公众号 「清菡软件测试」 首发,更多原创文章:清菡软件测试 143+ 原创文章,欢迎关注、交流,禁止第三方擅自转载。如有转载,请标明出处。