__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)
person
yak
schedule
13.10.2011