пятница, 31 июля 2015 г.

Строковое представление объектов: __repr__ и __str__

Встроенные функции print и str (а также её внутренний эквивалент, который используется функцией print) сначала пытается использовать метод __str__. Вообще, этот метод должен возвращать строковое представление в удобном для пользователя виде.

Во всех остальных случаях используется метод __repr__: функцией автоматического вывода в интерактивной оболочке, функциями print и str, когда в классе отсутствует метод __str__. Вообще этот метод должен возвращать строку, которая могла бы использоваться как программный код для восстановления объекта или содержать информацию, полезную для разработчиков.

Проще говоря, метод __repr__ используется везде, за исключением функций print и str, если определен метод __str__. Однако если метод __str__ отсутствует, операции вывода будут использовать __repr__, но не наоборот — в остальных случаях, например, функцией автоматического вывода в интерактивной оболочке всегда используется только метод __repr__; попытка использовать метод __str__ даже не предпринимается:

class TestInteractiveOutput(object):
    def __init__(self, text):
        self.text = text

    def __str__(self):
        return 'text: {}'.format(self.text)
t_obj = TestInteractiveOutput('hello, world')
t_obj
<__main__.TestInteractiveOutput object at 0x0303B5D0>
Источник: Лутц М. Изучаем Python, 4-е издание. — Пер. с англ. — СПб.: Символ-Плюс, 2011, стр. 812-813.