Question

Je veux une chaîne avec un attribut supplémentaire, disons s'il faut l'imprimer en rouge ou en vert.

Le sous-classement (str) ne fonctionne pas car il est immuable. Je vois la valeur, mais cela peut être agaçant.

Est-ce que l'héritage multiple peut aider? Je n'ai jamais utilisé ça.

Hériter uniquement d'un objet et utiliser self.value = str signifie que je dois implémenter moi-même tous les messages de type chaîne (comme strip).

Ou y a-t-il un moyen de les transmettre, comme la méthode manquante de Ruby?

Je pense que l’utilisation d’un dictionnaire de niveau classe indexé par instance pour stocker la couleur pourrait fonctionner. Trop moche?

Était-ce utile?

La solution

str peut être hérité sauf si vous utilisez une version très ancienne de python, par exemple:

>>> 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

Autres conseils

Une classe personnalisée contenant une chaîne serait peut-être une meilleure approche. Avez-vous vraiment besoin de transmettre toutes les méthodes de chaîne à la chaîne sous-jacente? Pourquoi ne pas exposer la chaîne via une propriété et permettre aux consommateurs de la classe de faire ce qu’ils souhaitent?

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

Il est généralement préférable d’utiliser des chaînes immuables & amp; mais si vous en avez besoin, c’est le moyen le plus simple de l’obtenir.

Vous avez besoin de toutes les méthodes de string, alors développez string et ajoutez vos détails supplémentaires. Et si la ficelle est immuable? Juste rendre votre classe immuable, aussi. Ensuite, vous créez quand même de nouveaux objets pour ne pas gâcher accidentellement en pensant que c’est un objet mutable.

Ou, si Python en a un, étendez une variante de chaîne mutable. Je ne connais pas suffisamment Python pour savoir si une telle structure existe.

Vous pouvez essayer d'utiliser le module stringlike dans PyPI . Voici un exemple .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top