2009-05-04 6 views
6

Voglio una stringa con un attributo aggiuntivo, diciamo se stamparlo in rosso o verde.Come concedere stringhe alla mia classe?

La sottoclasse (str) non funziona perché è immutabile. Vedo il valore, ma può essere fastidioso.

È possibile un aiuto di ereditarietà multipla? Non l'ho mai usato.

Ereditare solo oggetto e utilizzando self.value = str significa che devo implementare tutti i messaggi di stringhe (come la striscia) da solo.

O c'è un modo per inoltrarli, come Ruby's missing_method?

Penso che usare un dizionario a livello di classe indicizzato per istanza per memorizzare il colore possa funzionare. Troppo brutto?

risposta

6

str può essere ereditata solo se si utilizza una vecchia versione di Python, per esempio:

>>> class A(str): 
... def __new__(cls, color, *args, **kwargs): 
...  newobj = str.__new__(cls, *args, **kwargs) 
...  newobj.color = color 
...  return newobj 
>>> a = A("#fff", "horse") 
>>> a.color 
'#fff' 
>>> a 
'horse' 
>>> a.startswith("h") 
True 
+3

Questo è buono. Ma devi stare attento con questo approccio. Se hai fatto qualsiasi operazione di stringa come (title(), +, ...) il risultato sarà di tipo str not A. –

+0

Ho avuto l'impressione che proprio questo NON avrebbe funzionato, da qui la domanda. Si è scoperto che era un errore di programmazione nel mio __new__ e ho interpretato erroneamente il messaggio inadeguato di Python. – Tobias

2

Forse una classe personalizzata che contiene una stringa sarebbe un approccio migliore. Hai davvero bisogno di passare tutti i metodi di stringa attraverso la stringa sottostante? Perché non esporre la stringa tramite una proprietà e consentire ai consumatori della classe di fare tutto ciò che desiderano?

0

Sono necessari tutti i metodi della stringa, quindi estendere la stringa e aggiungere i dettagli aggiuntivi. Quindi cosa succede se la stringa è immutabile? Rendi anche la tua lezione immutabile. Quindi stai creando comunque nuovi oggetti in modo da non rovinare per sbaglio pensando che si tratti di un oggetto mutevole.

Oppure, se Python ne ha uno, estendere una variante mutabile di stringa. Non conosco abbastanza bene Python per sapere se esiste una struttura del genere.

2
import UserString 
class mystr(UserString.MutableString): 
    ... 

E 'generalmente meglio usare le stringhe immutabili & sottoclassi della stessa, ma se avete bisogno di uno mutabile questo è il modo più semplice per ottenerlo.

+0

Questo è obsoleto dal momento che python 2.2 –

+0

La classe UserString era deprecata in 2.2, ma la classe MutableString era obsoleta solo in 2.6 - vedere http://docs.python.org/library/userdict.html - se sei sicuro stai per utilizzare 2.6 o versioni successive, una stringa mutabile può essere implementata in cima al nuovo tipo di pertearray (matrice mutabile di byte) –

0

Si potrebbe provare a utilizzare il modulo stringlike in PyPI. Ecco an example.