Domanda

Voglio una stringa con un attributo aggiuntivo, diciamo se stamparla in rosso o verde.

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

L'ereditarietà multipla può essere d'aiuto? Non l'ho mai usato.

Ereditare solo l'oggetto e usare self.value = str significa che devo implementare da solo tutti i messaggi di stringheness (come strip).

O c'è un modo per inoltrarli, come il metodo mancante di Ruby?

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

È stato utile?

Soluzione

str può essere ereditato a meno che non si stia utilizzando una versione di Python molto vecchia, ad 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

Altri suggerimenti

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

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

In genere è meglio usare stringhe e amp; immutabili sottoclassi, ma se ne hai bisogno uno mutevole questo è il modo più semplice per ottenerlo.

Sono necessari tutti i metodi di stringa, quindi estendi la stringa e aggiungi i dettagli aggiuntivi. E se la stringa fosse immutabile? Rendi immutabile anche la tua classe. Quindi stai creando nuovi oggetti in modo da non sbagliare casualmente pensando che sia un oggetto mutabile.

Oppure, se Python ne ha uno, estendi una variante mutabile di stringa. Non ho abbastanza familiarità con Python per sapere se esiste una tale struttura.

Potresti provare a utilizzare il modulo stringlike in PyPI . Ecco un esempio .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top