6
votes

Modifier la chaîne sous-classée en place

J'ai la sous-classe de chaîne suivante:

>>> x = S("My")
>>> x.conc("name")
'My name'
>>> x
'My'


2 commentaires

Les docs vous disent à Wrap 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 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.


5 Réponses :


3
votes

la ligne auto = auto + délimiter + next_val Création d'un nouvelle variable auto et attribuant le résultat de auto + délimiteur + Next_val à ceci. Pour réaliser ce que vous voulez, vous devez appliquer l'opération directement à la variable auto . Mais comme les chaînes sont immuables, vous ne pouvez pas faire cela. C'est exactement pourquoi toutes les méthodes str S renvoient une nouvelle chaîne plutôt que de modifier les chaînes qu'ils fonctionnent.

Désolé, vous ne pouvez pas faire ce que vous essayez d'accomplir.


0 commentaires

0
votes

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

Votre Conc ne fonctionne pas car Python n'a pas de référence pass par référence. Self = ... ne change pas l'objet actuel, il écrase simplement une variable locale ( self.member = ... ) fait Travailler cependant, car c'est une méthode appelant à modifier un dictionnaire).


2 commentaires

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.



4
votes

Vous ne pouvez pas faire ce que vous demandez, car les chaînes sont immuables. Les docs vous disent à envelopper la classe str ; 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 (mais est parti dans Python 3); Il est assez facile d'écrire, bien que: xxx

Cependant, un meilleur plan est d'utiliser un stringio . En fait, vous pouvez être assez proche de la fonctionnalité que vous vouliez par sous-classement stringio (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 ). C'est Natre, plus rapide et totalement imo plus élégant. xxx

Vous pouvez remplacer __ rep __ si vous voulez x à Regardez encore plus comme une corde, mais c'est une mauvaise pratique, car, dans la mesure du possible __ RECR __ est destiné à renvoyer une description dans Python de l'objet.


2 commentaires

Comme vous l'avez suggéré dans votre commentaire à ma question, je viens de changer de classe pour hériter de objet et utilisé __ init __ 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.



1
votes

Les cordes Python (et tout ce qui y héritent d'eux) sont immuables.

Il y a une classe appelée mutablestring dans le module d'utilisateur qui pourrait faire ce que vous voulez.

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.


0 commentaires

0
votes

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


2 commentaires

Votre exemple ne fonctionne que si vous "Sous-classe" objet au lieu de str .


Merci, édité. J'ai été tenté d'hériter toutes les méthodes par défaut de str . 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 ?