Розширення __str __ (), а не заміна його

Я хочу розповсюдити метод __ str __() мого об'єкта. str (obj) в даний час читається:


Мені подобається адреса як унікальний ідентифікатор, але я хочу додати деякі атрибути. Який найкращий спосіб це продовжити, зберігаючи при цьому частину адреси? Я хотів би виглядати приблизно так:


Я не бачу жодного атрибута, який зберігає адресу. Я використовую python 2.4.3.

Edit: Would be nice to know how to do this with __repr__()

Solution (for python 2.4.3):

def __repr__(self):
    return "
1
Перш за все, не використовуйте таку застарілу версію пітона. Крім того, для чого ви намагаєтесь зробити, є __ repr __ .
додано Автор ThiefMaster, джерело

2 Відповіді

Ви можете отримати адресу за допомогою 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) .

5
додано
Відредаговано мати повну відповідь.
додано Автор Michael Hoffman, джерело
А як щодо відпочинку? Я бачу, що клас obj .__ класу __.__ name__ поверне тест, а як щодо назви модуля?
додано Автор shadowland, джерело
Це зробило. Я просто повинен був використовувати% s, як ви запропонували.
додано Автор shadowland, джерело
class Mine(object):
    def __str__(self):
        return object.__str__(self) + " own attributes..."
1
додано
Це не дасть бажаного результату. Він хоче, щоб все було в кутових дужках у його прикладі. Це поверне оригінал, який знаходиться в його власному наборі кутових дужок і додає його атрибути "назовні" від них.
додано Автор Brandon Buck, джерело
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;