Шаг 131.
Python: сборник рецептов.
Классы и объекты. Настройка строкового форматирования

    На этом шаге мы рассмотрим переобредение метода __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.

    На следующем шаге мы рассмотрим создание объектов, поддерживающих протокол менеджера контекста.




Предыдущий шаг Содержание Следующий шаг