Я пытаюсь подклассифицировать объект set
в Python, используя код, подобный приведенному ниже, но я не могу найти разумное определение __repr__
.Определение __repr__ при установке подкласса в Python
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
Я хотел бы определить __repr__
таким образом, что я могу получить следующий вывод:
>>> Alpha('Salem', (1,2,3))
Alpha('Salem', set([1, 2, 3]))
Однако, если я не отменяю __repr__
, выход я получаю игнорирует name
значение ...
>>> Alpha('Salem', (1,2,3))
Alpha([1, 2, 3])
... а если я переопределить __repr__
, я не могу получить прямой доступ к значениям в наборе, не создавая новый экземпляр набора:
Это работает, но создает новый экземпляр набора для __repr__
, которые затем будут утилизировать кажется неуклюжим и неэффективным для меня.
Есть ли лучший способ определить __repr__
для такого класса?
Редактировать: Другое решение, которое произошло со мной: я могу хранить набор локально. Это кажется немного опрятным, чем другие варианты (создание и уничтожение чего-то для каждого вызова __repr__
или использование какой-либо формы манипуляции с строкой), но все же кажется менее идеальным для меня.
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
self._set = set(s)
def __repr__(self):
return "%s(%r, %r)" % (self.__class__.__name__, self.name, self._set)
способ вызова 'super', вы будете получить бесконечную рекурсию, если подклассы пытаются называть '__init__'. Причина 'super' явно принимает класс в том, что он знает, где продолжить в порядке разрешения метода (MRO). Передайте 'Alpha' (или если это указывает на 3.x, как указано в тегах, просто используйте' super() '- он делает что-то как-то). – delnan
@ delnan: Dang. Спасибо за это. И я подумал, что я умею избегать указания класса явно. –
@ delnan: По какой-то причине Sven Marnach briely отметил этот вопрос как Python 3.x. Я на самом деле использую Python 2.6. –