8.2 自定义å—ç¬¦ä¸²çš„æ ¼å¼�化¶
问题¶
ä½ æƒ³é€šè¿‡ format() 函数和å—符串方法使得一个对象能支æŒ�è‡ªå®šä¹‰çš„æ ¼å¼�化。
解决方案¶
为了自定义å—ç¬¦ä¸²çš„æ ¼å¼�化,我们需è¦�在类上é�¢å®šä¹‰ __format__() 方法。例如:
_formats = {
'ymd' : '{d.year}-{d.month}-{d.day}',
'mdy' : '{d.month}/{d.day}/{d.year}',
'dmy' : '{d.day}/{d.month}/{d.year}'
}
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def __format__(self, code):
if code == '':
code = 'ymd'
fmt = _formats[code]
return fmt.format(d=self)
现在 Date 类的实例å�¯ä»¥æ”¯æŒ�æ ¼å¼�化æ“�作了,如å�Œä¸‹é�¢è¿™æ ·ï¼š
>>> d = Date(2012, 12, 21)
>>> format(d)
'2012-12-21'
>>> format(d, 'mdy')
'12/21/2012'
>>> 'The date is {:ymd}'.format(d)
'The date is 2012-12-21'
>>> 'The date is {:mdy}'.format(d)
'The date is 12/21/2012'
>>>
讨论¶
__format__() 方法给Pythonçš„å—ç¬¦ä¸²æ ¼å¼�化功能æ��供了一个钩å�。
这里需è¦�ç�€é‡�å¼ºè°ƒçš„æ˜¯æ ¼å¼�化代ç �的解æž�å·¥ä½œå®Œå…¨ç”±ç±»è‡ªå·±å†³å®šã€‚å› æ¤ï¼Œæ ¼å¼�化代ç �å�¯ä»¥æ˜¯ä»»ä½•值。
例如,å�‚考下é�¢æ�¥è‡ª datetime 模å�—ä¸çš„代ç �:
>>> from datetime import date
>>> d = date(2012, 12, 21)
>>> format(d)
'2012-12-21'
>>> format(d,'%A, %B %d, %Y')
'Friday, December 21, 2012'
>>> 'The end is {:%d %b %Y}. Goodbye'.format(d)
'The end is 21 Dec 2012. Goodbye'
>>>
å¯¹äºŽå†…ç½®ç±»åž‹çš„æ ¼å¼�åŒ–æœ‰ä¸€äº›æ ‡å‡†çš„çº¦å®šã€‚ å�¯ä»¥å�‚考 string模å�—文档 说明。