__str__、__repr__和__format__

  • 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'))
posted @ 2019-08-05 10:23  日新其德止于至善  阅读(148)  评论(0编辑  收藏  举报