zoukankan      html  css  js  c++  java
  • __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'))
    
  • 相关阅读:
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
    小D课堂
  • 原文地址:https://www.cnblogs.com/iamluoli/p/11288185.html
Copyright © 2011-2022 走看看