8.1 改å�˜å¯¹è±¡çš„å—符串显示¶
问题¶
ä½ æƒ³æ”¹å�˜å¯¹è±¡å®žä¾‹çš„æ‰“å�°æˆ–显示输出,让它们更具å�¯è¯»æ€§ã€‚
解决方案¶
è¦�改å�˜ä¸€ä¸ªå®žä¾‹çš„å—符串表示,å�¯é‡�新定义它的 __str__() å’Œ __repr__() 方法。例如:
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 '({0.x!s}, {0.y!s})'.format(self)
__repr__() 方法返回一个实例的代ç �表示形å¼�,通常用æ�¥é‡�æ–°æž„é€ è¿™ä¸ªå®žä¾‹ã€‚
内置的 repr() 函数返回这个å—符串,跟我们使用交互å¼�è§£é‡Šå™¨æ˜¾ç¤ºçš„å€¼æ˜¯ä¸€æ ·çš„ã€‚
__str__() 方法将实例转æ�¢ä¸ºä¸€ä¸ªå—符串,使用 str() 或 print() 函数会输出这个å—符串。比如:
>>> p = Pair(3, 4)
>>> p
Pair(3, 4) # __repr__() output
>>> print(p)
(3, 4) # __str__() output
>>>
æˆ‘ä»¬åœ¨è¿™é‡Œè¿˜æ¼”ç¤ºäº†åœ¨æ ¼å¼�åŒ–çš„æ—¶å€™æ€Žæ ·ä½¿ç”¨ä¸�å�Œçš„å—符串表现形å¼�。
特别æ�¥è®²ï¼Œ!r æ ¼å¼�化代ç �指明输出使用 __repr__() æ�¥ä»£æ›¿é»˜è®¤çš„ __str__() 。
ä½ å�¯ä»¥ç”¨å‰�é�¢çš„ç±»æ�¥è¯•ç�€æµ‹è¯•下:
>>> p = Pair(3, 4)
>>> print('p is {0!r}'.format(p))
p is Pair(3, 4)
>>> print('p is {0}'.format(p))
p is (3, 4)
>>>
讨论¶
自定义 __repr__() å’Œ __str__() é€šå¸¸æ˜¯å¾ˆå¥½çš„ä¹ æƒ¯ï¼Œå› ä¸ºå®ƒèƒ½ç®€åŒ–è°ƒè¯•å’Œå®žä¾‹è¾“å‡ºã€‚
例如,如果仅仅å�ªæ˜¯æ‰“å�°è¾“出或日志输出æŸ�个实例,那么程åº�å‘˜ä¼šçœ‹åˆ°å®žä¾‹æ›´åŠ è¯¦ç»†ä¸Žæœ‰ç”¨çš„ä¿¡æ�¯ã€‚
__repr__() 生æˆ�的文本å—ç¬¦ä¸²æ ‡å‡†å�šæ³•æ˜¯éœ€è¦�让 eval(repr(x)) == x 为真。
如果实在ä¸�èƒ½è¿™æ ·å�å�šï¼Œåº”该创建一个有用的文本表示,并使用 < å’Œ > 括起æ�¥ã€‚比如:
>>> f = open('file.dat')
>>> f
<_io.TextIOWrapper name='file.dat' mode='r' encoding='UTF-8'>
>>>
如果 __str__() 没有被定义,那么就会使用 __repr__() �代替输出。
上é�¢çš„ format() æ–¹æ³•çš„ä½¿ç”¨çœ‹ä¸ŠåŽ»å¾ˆæœ‰è¶£ï¼Œæ ¼å¼�化代ç � {0.x} 对应的是第1个å�‚æ•°çš„x属性。
å› æ¤ï¼Œåœ¨ä¸‹é�¢çš„函数ä¸ï¼Œ0实际上指的就是 self 本身:
def __repr__(self):
return 'Pair({0.x!r}, {0.y!r})'.format(self)
作为这ç§�å®žçŽ°çš„ä¸€ä¸ªæ›¿ä»£ï¼Œä½ ä¹Ÿå�¯ä»¥ä½¿ç”¨ % æ“�作符,就åƒ�下é�¢è¿™æ ·ï¼š
def __repr__(self):
return 'Pair(%r, %r)' % (self.x, self.y)