2013-02-12 3 views
1

Я работал над большим заданием, и я почти закончил, за исключением того, что мне нужна помощь при написании функций контейнера Set __str__ и __repr__.Определение __str__ и __repr__ для заданного контейнера

Я никогда не делал этого, и я понятия не имею, что делать. Поиск в Интернете, я все еще застрял.

Я пытался что-то вроде:

'%s(%r)' % (self.__class__, self) 

мне нужно распечатать представление, как это:

'set([ELEMENT_1, ELEMENT_2,..., ELEMENT_N])' 

Мои элементы хранятся в классе массива, который я написал множество контейнера вокруг , Я обращаюсь к нему с помощью петли типа for item in self или if item in self

Помогите?

+0

Это может помочь вам понять [ Страница переполнения стека говорит о различиях между __repr__ и __str __] [1] [1]: http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python – Jroosterman

ответ

1

Я подозреваю, что следующее будет работать:

def __repr__(self): 
    return 'set([%s])' % ', '.join(self) 
1

Смотрите эту answer подробно разницу между __str__ и __repr__.

Базовая реализация будет что-то вроде:

def __repr__(self): 
    return 'set(%r)' % [item for item in self] 
+0

Это, кажется, работает .. СПАСИБО !!! Я прочитал эту ссылку ранее сегодня. –

0

Что-то же просто, как это может быть достаточно хорошим, и будет заботиться о обоих методов:

class Set(object): 
    def __init__(self): 
     self.array = ... 

    def __repr__(self): 
     return '{}({!r})'.format(self.__class__.__name__, self.array) 

    __str__ = __repr__ 
+0

", если' __repr__' определен, а '__str__' - нет, объект будет вести себя как' __str __ = __ repr__'. " - [ссылка] (http://stackoverflow.com/a/2626364/1988505) –

+0

Достаточно. Главным моментом был '{! R}' в строке формата, который будет заменен на 'repr (self.array)', который, конечно, будет зависеть именно от того, что он есть, и делает его объектно- ориентированный дизайн. – martineau