>[success] # 修改实例的字符串表示 ~~~ 1.让一个实例打印出我们想要的格式展示 2.其中__repr__ 是偏向类的字符串展示 3.__str__是偏向对象的字符串展示 4.__repr__和__str__ 同时在类里面定义,print 输出格式会按照str的来 5.如果想让按照__repr__需要指定格式例如:'{!r}'.format(p) 用!r的格式 6.最好推荐只定义__repr__,为啥我也不知道 ~~~ >[danger] ##### 代码说明 ~~~ 1.可以看出直接调用对象和打印对象的格式是有区别的 ~~~ ~~~ class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t = Test() >>> t <__main__.Test at 0x7fa91c307190> >>> print (t) <__main__.Test object at 0x7fa91c307190> ~~~ ~~~ 1.重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了 ~~~ ~~~ # 重构__repr__ class TestRepr(Test): def __repr__(self): return 'TestRepr(%s)' % self.data >>> tr = TestRepr() >>> tr TestRepr(hello, world!) >>> print tr TestRepr(hello, world!) ~~~ ~~~ 1. 你会发现,直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了 ~~~ ~~~ # 重构__str__ calss TestStr(Test): def __str__(self): return '[Value: %s]' % self.data >>> ts = TestStr() >>> ts <__main__.TestStr at 0x7fa91c314e50> >>> print (ts) [Value: hello, world!] ~~~ ~~~ 1.当同时定义的时候print输出的结果是定义的str 2.当想通过print打印出repr 给利用指定格式!r ~~~ ~~~ # 同时定义 class Pair: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return 'Pair({0.x!r}, {0.y!r})'.format(self) def __str__(self): return '1' p = Pair(3,4) print(p) print('{!r}'.format(p)) 打印结果: 1 Pair(3, 4) ~~~