• obj.__ str __ ()是面向用户的,该方法将实例转换为一个字符
  • obj.__ repr __ ()面向程序员,该方法返回一个实例的代码表示形式,通常用来重新构造这个实例,repr()函数返回的字符串,和我们使用交互式显示的值是一样的,__ repr __ ()生成的文本字符串标准做法是需要让eval(repr(x)) == x为真
  • obj.__ format __:自定制格式化字符串
  • __str__和__repr__区别与联系:
    • 上述两个方法返回值必须是字符串,否则抛出异常;
    • 这两个方法都是自定义类的字符串描述,但是两个的调用机制不同:
      • 使用str函数或者print函数会调用__str__;
      • 使用repr函数或者交互式解释器时会调用__repr__;如果__str__没有被定义,那么就会使用__repr__来代替输出;当我们查看对象的时候会调用repr;列表以及字典等容器总是会使用 repr 方法。即使你显式的调用 str 方法,也是如此
  >>> class Animal():

      def __init__(self, name):
self.name = name def __str__(self):
return '__str__ Animal' def __repr__(self):
return '__repr__ Animal' >>>
>>> animal = Animal('cat')
>>> animal
__repr__ Animal
>>> repr(animal)
'__repr__ Animal'
>>> str(animal)
'__str__ Animal'
>>> print(animal)
__str__ Animal
>>> str([animal])
'[__repr__ Animal]'

  那么__str__和__repr__到底有什么不同呢?

 >>> from datetime import datetime
>>> today = datetime.now()
>>> today
datetime.datetime(2019, 8, 2, 13, 38, 54, 71000)
>>> print(today)
2019-08-02 13:38:54.071000

  观察上面的结果我们可以看出

    __str__的结果可读性更强,__str__是面向用户的,因此返回的信息更清晰容易理解;

    __repr__的结果更精确和详细,__repr__是面向程序员的,它存在的目的是为了调试,便于开发者使用。
  class Animal():

      def __str__(self):
return 'print时调用该方法' obj = Animal()
print(obj)
format_dict={
'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
}
  class School:
def __init__(self,name,addr,type):
self.name=name
self.addr=addr
self.type=type def __repr__(self):
return 'School(%s,%s)' %(self.name,self.addr)
def __str__(self):
return '(%s,%s)' %(self.name,self.addr) def __format__(self, format_spec):
# if format_spec
if not format_spec or format_spec not in format_dict:
format_spec='nat'
fmt=format_dict[format_spec]
return fmt.format(obj=self) s1=School('Hogwarts','FL','magic')
print('from repr: ',repr(s1))
print('from str: ',str(s1))
print(s1) print(format(s1,'nat'))
print(format(s1,'tna'))
print(format(s1,'tan'))
print(format(s1,'asfdasdffd'))

最新文章

  1. oracle--第一天PLSQL--bai
  2. NuGet安装及使用教程
  3. 自定义不等高cell—storyBoard或xib自定义不等高cell
  4. linux脚本编程技术---8
  5. 初步掌握Yarn的架构及原理
  6. JAVA中的正则表达式--待续
  7. WSImport
  8. TCP的三次握手和四次挥手(转)
  9. hdu-4419-Colourful Rectangle-段树区,并寻求
  10. maven和libgdx
  11. Oracle中如何插入特殊字符:& 和 ' (多种解决方案)-转载
  12. SQL Server学习之路(六):“增删改查”之“查”
  13. 《深入理解Bootstrap》读书笔记(一)
  14. Python利用pandas处理Excel数据的应用
  15. oldboy es和logstash
  16. sqlserver2008查看表记录或者修改存储过程出现目录名无效错误解决方法
  17. Visual Studio 中使用万能头文件 #include <bits/stdc++.h>
  18. query
  19. python更新tomcat脚本
  20. [c#]记一次实验室局域网的ARP欺骗

热门文章

  1. spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看
  2. 一维数组的初始化及遍历 Day06
  3. PHPExcel 设置表格边框
  4. poj 3169 Layout (差分约束)
  5. IDEA 通过数据库生成entity实体类
  6. Android Studio(二):快捷键设置、插件安装
  7. eclipse maven项目导出所使用的jar包
  8. web项目的文件上传和 下载
  9. SuperSocket特点
  10. "?:"在正则表达式中什么意思