Расширение __str __ () вместо его замены - PullRequest
1 голос
/ 28 октября 2011

Я хочу расширить __str__() метод моего объекта. str(obj) в настоящее время читает:

<mymodule.Test object at 0x2b1f5098f2d0>

Мне нравится адрес как уникальный идентификатор, но я хочу добавить некоторые атрибуты. Какой лучший способ расширить это, сохраняя при этом адресную часть? Я бы хотел выглядеть примерно так:

<mymodule.Test object at 0x2b1f5098f2d: name=foo, isValid=true>

Я не вижу ни одного атрибута, который хранит адрес. Я использую Python 2.4.3.

Редактировать : Было бы здорово узнать, как это сделать с __repr __ ()

Решение (для python 2.4.3):

def __repr__(self):
    return "<%s.%s object at %s, name=%s, isValid=%s>" % (self.__module__,
           self.__class__.__name__, hex(id(self)), self.name, self.isValid)

Ответы [ 2 ]

5 голосов
/ 28 октября 2011

Вы можете получить адрес с id(obj).Возможно, вы захотите изменить метод __repr__() вместо __str__().Вот код, который сделает это в Python 2.6 +:

class Test(object):
    def __repr__(self):
        repr_template = ("<{0.__class__.__module__}.{0.__class__.__name__}"
                         " object at {1}: name={0.name}, isValid={0.isValid}>")

        return repr_template.format(self, hex(id(self)))

Тест с:

test = Test()
test.name = "foo"
test.isValid = True
print repr(test)
print str(test)
print test

Вы можете легко сделать то же самое в более старой версии Python, используя строкуоперации форматирования, такие как "%s" вместо более ясного синтаксиса str.format().Если вы собираетесь использовать str.format(), вы также можете использовать его встроенную возможность шестнадцатеричного форматирования, используя {1:#x} в шаблоне и изменив аргумент 1 с hex(id(self)) на просто id(self).

1 голос
/ 28 октября 2011
class Mine(object):
    def __str__(self):
        return object.__str__(self) + " own attributes..."
...