Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辨认,这就是“字符串表示形式”。repr就是通过__repr__这个特殊方法来得到一个对象的字符串表示形式。如果没有实现__repr__,当我们再控制台里打印一个变量的实例时,得到的字符串可能会是<__main__.Object at 0x14af07dbe80>,这个表示的是打印的对象,以及对象的内存地址

现在让我们看看__str__和__repr__这两个方法有什么区别

首先定义一个类

class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y def __str__(self):
return 'str Vector(%s, %s)' % (self.x, self.y)

 

然后我们在控制台上打印这个类的对象实例

>>> Vector(1, 2)
<__main__.Vector at 0x14af07dbe80>
>>> str(Vector(1, 2))
'str Vector(1, 2)'
>>> print(Vector(1, 2))
str Vector(1, 2)

  

从上面的例子我们可以看到,当把变量的实例输入到控制台,会打印出对象的类型和对象的地址,当把对象作为参数传给str或者print方法,则会调用对象的__str__方法

 

现在,我们删除原来的__str__方法,加上__repr__方法,再在控制台做一样的操作,看看会有什么不同

class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y def __repr__(self):
return 'repr Vector(%s, %s)' % (self.x, self.y)

  

重复之前打印Vector对象操作

>>> Vector(1, 2)
repr Vector(1, 2)
>>> str(Vector(1, 2))
'repr Vector(1, 2)'
>>> print(Vector(1, 2))
repr Vector(1, 2)

  

我们可以看到,实现我们没有实现__str__方法,但在调用str()的时候,str()会自动调用__repr__方法,并且在控制台输入对象实例的时候,出来的不再是对象类型和内存地址,而是打印我们所希望表达的对象信息

最后,我们在Vector类中加上__str__和__repr__方法

class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y def __str__(self):
return 'str Vector(%s, %s)' % (self.x, self.y) def __repr__(self):
return 'repr Vector(%s, %s)' % (self.x, self.y)

  

重复之前的操作

>>> Vector(1, 2)
repr Vector(1, 2)
>>> str(Vector(1, 2))
'str Vector(1, 2)'
>>> print(Vector(1, 2))
str Vector(1, 2)

  

可以知道,当把对象作为参数传入print()时,会自动调用对象的__str__方法,但是当__str__方法不存在时,则会调用__repr__方法。所以,如果你只想实现这两个特殊方法中的一个,建议还是选择__repr__方法。

  

最新文章

  1. CentOS7安装iptables防火墙
  2. Vim 资料总结
  3. 锋利的jQuery-6--序列化函数serialize()和serializeArray()在表单提交中的作用
  4. FFT(1)
  5. hdu 2061
  6. 【BZOJ】【1324】王者之剑
  7. Codeforces Gym 100570 E. Palindrome Query Manacher
  8. logger日志工具类
  9. 单独谈谈 Android Cursor 的使用细节
  10. Maven详解(六)------ 生命周期
  11. 使用django执行数据更新命令时报错:django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.00 01_initial on database &#39;default&#39;.
  12. interface中定义default方法和static方法
  13. Android Studio配置文件路径修改
  14. 改装原生的dialog
  15. 03. pt-config-diff
  16. WCF路由服务
  17. 《mysql必知必会》学习_第六章_20180730_欢
  18. spring事务管理及相关知识
  19. jdk内置类javax.imageio.ImageIO支持的图片处理格式
  20. LAXCUS大数据操作系统3.03版本发布,欢迎使用试用

热门文章

  1. 配置ftp服务器
  2. 前端js优化方案(一)
  3. Jackson使用手册
  4. php编码转换相关
  5. 构建第一个spring boot2.0应用之项目启动运行的几种方式(二)
  6. 【Mood-13】Android --如何从初级工程师进化为高级工程师
  7. C#中描述mssql中DateTime的最小值、最大值
  8. hdu-2112 HDU Today---dijkstra+标号
  9. 【BZOJ4327】[JSOI2012] 玄武密码(AC自动机的小应用)
  10. js 封装父页面子页面交互接口