На этом шаге мы рассмотрим переобредение метода __format__().
Вы хотите, чтобы объект поддерживал кастомизированное форматирование через функцию 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, в которой приведена формальная спецификация.
https://docs.python.org/3/library/string.html.
На следующем шаге мы рассмотрим создание объектов, поддерживающих протокол менеджера контекста.