__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'))

转载于:https://www.cnblogs.com/iamluoli/p/11288185.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值