__repr__
должен возвращать строку, которая описывает объект. Если возможно, это должно быть допустимое выражение Python, которое оценивается как равный объект. Это верно для встроенных типов, таких как int
или str
:
>>> x = 'foo'
>>> eval(repr(x)) == x
True
Если это невозможно, это должна быть строка '<...>'
, однозначно описывающая объект. По умолчанию __repr__
является примером этого:
>>> class Foo(object):
pass
>>>
>>> repr(Foo())
'<__main__.Foo object at 0x02A74E50>'
Он использует адрес объекта в памяти, чтобы однозначно идентифицировать его. Конечно, адрес ничего не говорит нам об объекте, поэтому полезно переопределить __repr__
и вернуть строку, описывающую состояние объекта.
Состояние объекта определяется другими объектами, которые он содержит, поэтому имеет смысл включить их repr
в ваш. Это именно то, что list
или dict
делает:
>>> repr(['bar', Foo()])
"['bar', <__main__.Foo object at 0x02A74710>]"
В вашем случае состояние находится в ваших Column
свойствах, поэтому вы хотите использовать их repr
. Для этого вы можете использовать форматирование %r
, оно вставит repr()
аргумента:
def __repr__(self):
return '<Stats: description=%r, mystat=%r>' % (self.description, self.mystat)
Эквивалент с использованием нового форматирования:
def __repr__(self):
return '<Stats: description={0.description!r}, mystat={0.mystat!r}>'.format(self)