python: __repr__ 和 __str__的用法

python: __ repr__ 和 __str__的用法

概述:
__ repr __和__str__这两个方法都是用于显示的, __ str__是面向用户的,在调用str()和使用print()输出时调用,而__repr__面向程序员,用于交互模式下提示回应以及repr函数,如果没有使用 _ str _ , 会使用print和str。它通常应该返回一个编码字符串,可以用来重新创建对象,或者给开发者详细的显示。
__ repr __ goal is to be unambiguous.
__ str __ goal is to be readable.
python默认对象输出:
调用python默认 __ repr __ 方法, 如果 __ str __ 方法方法没定义, __ repr __ 方法定义了,则 __ str _= __ repr __
return "%s(%r)" % (self.__class__, self.__dict__)

class MyInteger:
    def __init__(self, v):
        self.data = v
I1 = MyInteger(-100)
print(I1) 

<__main__.MyInteger object at 0x7f839f99be80>v
显然python默认的对对象描述的输出是不友好的,一般类中重定义 __ repr __方法,方便调试。

__ repr __:

class MyInteger:
  def __init__(self, v):
      self.data = v

  def __repr__(self):
      return 'MyInteger(%r)' % self.data

  def __abs__(self):
      # 此方法用于制定abs(obj)函数取值时返回的结果

      if self.data < 0:
          return MyInteger(-self.data)  # 用-self.data创建一个新的对象返回回去


I1 = MyInteger(-100)
print(I1)  # 等同与print(str(i1))
I2 = abs(I1)
print(I2)
MyInteger(-100)
MyInteger(100)
  • 当调用print(I1)解释器第一个寻找的就是I1这个类的方法里面有没有重新定义 __ str__,如果没有,那么它第二步会去寻找这个类里面有没有重新定义repr,如果有则会用类方法的 __ repr__,如果还没有,那么解释器会找这个类的上一层父类,按同样的规则进行寻找,直到最后找到了object,然后用object的 __ str__方法,将该对象的内容转成字符串,最后输出到终端。
  • 我要输出一个需要自己加工的数据的时候,用object的 __ str__和 __ repr__显然不够,那么就需要在自己的类中重新写一个repr的方法, 一般采用:
    MyClass(this=%r,that=%r)" % (self.this,self.that)

细节:

  • 重构 __ repr__ 和 __ str __返回值必须是字符串类型
  • __ repr__采用%r来获取对象各个属性的标准字符串表示形式, MyInteger(-100) 和 MyInteger(“-100”)是不一样的,后者在本示例中会报错; 而 __ str__ 采用%s来处理对象。
  • __ repr__返回一个能代表此对象的表达式字符串, 这个表达式会被eval()翻译,结果就是调用 __ repr__时传入的对象,eval( __ repr__(obj))=obj

你可能感兴趣的:(python,python)