Sto cercando di creare una sottoclasse dell'oggetto set
in Python, utilizzando il codice simile al di sotto, ma non riesco a capire una definizione sensibile di __repr__
da usare.Definizione __repr__ quando sottoclasse messo in Python
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
mi piacerebbe definire __repr__
in modo tale che posso ottenere il seguente risultato:
>>> Alpha('Salem', (1,2,3))
Alpha('Salem', set([1, 2, 3]))
Tuttavia, se non a ignorare __repr__
, l'uscita ottengo ignora il name
valore ...
>>> Alpha('Salem', (1,2,3))
Alpha([1, 2, 3])
... mentre se faccio ignorare __repr__
, non posso ottenere l'accesso diretto ai valori del set senza creare una nuova istanza set:
Questo funziona, ma la creazione di una nuova istanza set per __repr__
che saranno poi smaltiti sembra goffo e inefficiente per me.
C'è un modo migliore per definire __repr__
per questo tipo di classe?
Modifica: Un'altra soluzione che mi è venuta in mente: posso memorizzare il set localmente. Sembra leggermente più ordinata rispetto alle altre opzioni (creando e distruggendo qualcosa per ogni chiamata di __repr__
o usando qualche forma di manipolazione delle stringhe), ma a me sembra tutt'altro che ideale.
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)
Il modo di chiamare 'super', ti ottenere una ricorsione infinita se le sottoclassi tentano di chiamare '__init__'. La ragione per cui 'super' prende esplicitamente una classe è che sa dove continuare nell'ordine di risoluzione dei metodi (MRO). Passa 'Alpha' (o se questo è 3.x come indicano i tag, usa semplicemente' super() '- fa la cosa giusta in qualche modo). – delnan
@delnan: Dang. Grazie per quello. E pensavo di essere stato furbo nel dover evitare di specificare esplicitamente la classe. –
@delnan: Per qualche ragione, Sven Marnach ha taggato questa domanda come Python 3.x. Sto effettivamente usando Python 2.6. –