Estoy tratando de subclasificar el objeto set
en Python, usando un código similar al siguiente, pero no puedo encontrar una definición sensata de __repr__
para usar.Definiendo __repr__ cuando se establece una subclasificación en Python
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
me gustaría definir __repr__
de tal manera que pueda obtener el siguiente resultado:
>>> Alpha('Salem', (1,2,3))
Alpha('Salem', set([1, 2, 3]))
Sin embargo, si no anulan __repr__
, la salida consigo ignora la name
valor ...
>>> Alpha('Salem', (1,2,3))
Alpha([1, 2, 3])
... mientras que si lo hago anular __repr__
, no puedo obtener acceso directo a los valores en el conjunto sin necesidad de crear una nueva instancia conjunto:
Esto funciona, pero la creación de una nueva instancia conjunto de __repr__
que luego serán eliminados parece torpe e ineficiente para mí.
¿Existe alguna manera mejor de definir __repr__
para este tipo de clase?
Editar: Otra solución que se me ocurrió: puedo almacenar el juego localmente. Parece algo más ordenado que las otras opciones (crear y destruir algo para cada llamada de __repr__
o usar alguna forma de manipulación de cadenas), pero aún así parece menos que ideal para mí.
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)
La forma de llamar 'super', podrás obtener recursión infinita si las subclases intentan llamar a '__init__'. La razón por la que 'super' explícitamente toma una clase es que sabe dónde continuar en el orden de resolución de método (MRO). Pase 'Alfa' (o si esto es 3.x como indican las etiquetas, simplemente use' super() '- de algún modo hace lo correcto). – delnan
@delnan: Dang. Gracias por eso. Y estaba yo pensando que estaba siendo astuto al evitar especificar la clase explícitamente. –
@delnan: por alguna razón, Sven Marnach etiquetó briely esta pregunta como Python 3.x. En realidad estoy usando Python 2.6. –