J'ai la sous-classe de chaîne suivante:
>>> x = S("My") >>> x.conc("name") 'My name' >>> x 'My'
5 Réponses :
la ligne Désolé, vous ne pouvez pas faire ce que vous essayez d'accomplir. P> auto = auto + délimiter + next_val code> Création d'un nouvelle variable
auto code> et attribuant le résultat de
auto + délimiteur + Next_val code> à ceci. Pour réaliser ce que vous voulez, vous devez appliquer l'opération directement à la variable
auto code>. Mais comme les chaînes sont immuables, vous ne pouvez pas faire cela. C'est exactement pourquoi toutes les méthodes
str code> S renvoient une nouvelle chaîne plutôt que de modifier les chaînes qu'ils fonctionnent. P>
Il n'y a pas de chaînes mutables. Il existe des octets / byTeArrays et des listes de chaînes d'un caractère, que vous pouvez modifier, puis transformer en une chaîne. Si vous souhaitez imiter une "chaîne mutable", vous devez conserver une chaîne dans un champ privé, remplacer cela et vous prétendez sinon que vous êtes cette chaîne (ceci est de manière propablement ce que Votre mutatable code> fait). Soyez averti, cependant: cela sera très inefficace et n'est probablement pas nécessaire. En outre, vous ne pouvez pas toujours utiliser des cordes mutables à la place des immuables (par exemple, en tant que clé dict). Pourquoi pensez-vous avoir besoin d'une chaîne mutable? Le reste d'entre nous (et les gars Java et .Net) s'entendent bien sans. P>
Conc code> ne fonctionne pas car Python n'a pas de référence pass par référence.
Self = ... code> ne change pas l'objet actuel, il écrase simplement une variable locale (
self.member = ... code>) fait em> Travailler cependant, car c'est une méthode appelant à modifier un dictionnaire). P>
Tout dans Python est une référence. Attribuer à soi-même rebinets le nom.
@Katrielaalex: Oui, chaque variable est une référence, mais Python passe ces références (ou des pointeurs, C / C ++ Speak) par une valeur.
Vous ne pouvez pas faire ce que vous demandez, car les chaînes sont immuables. Les docs vous disent à envelopper em> la classe Cependant, un meilleur plan est d'utiliser un Vous pouvez remplacer str code>; c'est-à-dire de faire une classe avec un attribut qui est la valeur actuelle de la "chaîne mutable". Cela existe dans la bibliothèque standard de Python 2.x en tant que
userstring.mutableString code> (mais est parti dans Python 3); Il est assez facile d'écrire, bien que:
stringio code>. En fait, vous pouvez être assez proche de la fonctionnalité que vous vouliez par sous-classement
stringio code> (note que vous devez utiliser la version python python et non la version C pour le faire, et c'est un style ancien. classe afin que vous ne puissiez pas utiliser
super code>). C'est Natre, plus rapide et totalement imo plus élégant. P>
__ rep __ code> si vous voulez
x code> à Regardez encore plus comme une corde, mais c'est une mauvaise pratique, car, dans la mesure du possible
__ RECR __ code> est destiné à renvoyer une description dans Python de l'objet. P> P>
Comme vous l'avez suggéré dans votre commentaire à ma question, je viens de changer de classe pour hériter de objet code> et utilisé
__ init __ code> pour définir la valeur de la chaîne. Fonctionne très bien!
Vient de voir vos nouveaux exemples après rafraîchissement. Bonne réponse approfondie.
Les cordes Python (et tout ce qui y héritent d'eux) sont immuables. P>
Il y a une classe appelée mutablestring dans le module d'utilisateur qui pourrait faire ce que vous voulez. p>
Si vous utilisez une version récente (comme dans la version 2.7 / 3.1) de Python, vous pouvez également consulter ByTeArray, bien qu'il ait eu son propre ensemble de limites et de bizarreries. P>
Voici une implémentation de ce que vous voulez faire:
class S(object): def __init__(self, val=""): self.data = val; def conc(self, next_val, delimiter = ' '): if not next_val is None: self.data = self.data + delimiter + next_val return self def __repr__(self): return self.data
Votre exemple ne fonctionne que si vous "Sous-classe" objet code> au lieu de
str code>.
Merci, édité. J'ai été tenté d'hériter toutes les méthodes par défaut de str code>. Mais, ne savait pas que cela ne fonctionnerait pas si j'ai ajouté une méthode personnalisée. Ne pouvons-nous pas ajouter nos propres méthodes si nous héritons
str code>?
Les docs vous disent à Wrap i> la classe de cordes ne le pas sous-classes! C'est-à-dire que vous voulez faire ce que vous vouliez faire une classe héritante de
objet code> avec un attribut tenant la valeur actuelle de la chaîne.
[Frappe le front avec la main] d'oh! Merci. Merci. Veuillez rendre votre commentaire ci-dessus une réponse (ou l'ajouter à votre existant) afin que je puisse l'accepter. J'ai pensé que j'avais manqué quelque chose d'évident.