老师的博客关于此知识点 http://www.cnblogs.com/Eva-J/articles/7351812.html#_label7
__str__和__repr__
改变对象的字符串显示__str__,__repr__
先来看一段代码
class Course: belong_to='old boy' def __init__(self,name,number,site,teacher): self.name=name self.number=number self.site=site self.teacher=teacher def __str__(self): print('我执行了__str__') return '好像写重复了,不管了,我执行了__str__方法' '申明一下我的返回值 必须是字符串的类型' def __repr__(self): print('我执行了__repr__操作') return '我是__repr__的返回值,我的返回值也必须是str类型' def fun(self): print('我就是是个弟弟,func功能而已') python =Course('python',92,'张家界','alex') print(python)#直接打印对象时,如果类的里面有__str__方法时,会调用__str__方法,并且返回return的值 # 此时调用的是Course里的__str__的方法 num= 1 print(num)#此时调用的是int 中的__str__方法 '''输出结果我执行了__str__ 好像写重复了,不管了,我执行了__str__方法申明一下我的返回值 必须是字符串的类型 1'''
注意事项和解释写在代码里面了
接着上面的代码
print('我是测试的下面是内容: %s'%python) '''
我执行了__str__
我是测试的下面是内容:
好像写重复了,不管了,我执行了__str__方法申明一下我的返回值 必须是字符串的类型
'''
以上可见,当print是如果里面有%s,%对象名时,也执行了__str__的方法,并且接受了其返回值,并打印了出来
同样,接着上面的的代码,来看如下:
print(str(python))
'''输出结果我执行了__str__
好像写重复了,不管了,我执行了__str__方法申明一下我的返回值 必须是字符串的类型'''
再来看如下代码
print('%r'%python) print(repr(python)) '''输出结果:我执行了__repr__操作 我是__repr__的返回值,我的返回值也必须是str类型 我执行了__repr__操作 我是__repr__的返回值,我的返回值也必须是str类型 '''
同理此时也是调用了对象中的__str__方法,并接受打印了返回值
总结一下:当一个类,对象中有__str__方法时,当print是有3中情况会调用__str__,并接受和打印其返回值
1.直接打印对象时 print(对象)
2.打印是有%s时,并且表明%s就是object(对象)时。print('内容%r)%对象,有点像格式化输出
3.print(str(对象))
执行__repr__时候
1.print(‘%r’%对象)
2.3.print(repr(对象))
__str__与__repr__的返回值必需是字符串的形式
值得注意的是,当没有__str__,但有__repr__时,__repr__变充当了__str__的角色,执行__repr__方法,并接受其返回值,打印出来
print(obj)/'%s'%obj/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串
如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。
repr(),只会找__repr__,如果没有找父类的