No puede hacer lo que pregunta, porque las cadenas son inmutables. Los documentos le dicen que envuelva la clase str
; es decir, para hacer una clase con un atributo que es el valor actual de la "cadena mutable". Esto existe en la biblioteca estándar de Python 2.x como UserString.MutableString
(pero se ha ido en Python 3); que es bastante fácil de escribir, sin embargo:
class MutableString(object):
def __init__(self, value):
self.value = value
def conc(self, value, delim=' '):
self.value = "{self.value}{delim}{value}".format(**locals())
def __str__(self):
return self.value
sin embargo, un plan mejor es utilizar un StringIO
. De hecho, puedes acercarte bastante a la funcionalidad que querías subclasificando StringIO
(ten en cuenta que necesitas usar la versión pura de Python no la versión C para hacer esto, y que es una clase de estilo antiguo, así que no puedes usar super
). Esto es más ordenado, más rápido y en conjunto IMO más elegante.
>>> from StringIO import StringIO as sIO
>>> class DelimitedStringIO(sIO):
... def __init__(self, initial, *args, **kwargs):
... sIO.__init__(self, *args, **kwargs)
... self.write(initial)
...
... def conc(self, value, delim=" "):
... self.write(delim)
... self.write(value)
...
... def __str__(self):
... return self.getvalue()
...
>>> x = DelimitedStringIO("Hello")
>>> x.conc("Alice")
>>> x.conc("Bob", delim=", ")
>>> x.conc("Charlie", delim=", and ")
>>> print x
Hello Alice, Bob, and Charlie
Puede anular __repr__
si quieres x
mirar aún más como una cadena, pero esto es una mala práctica, ya que en lo posible se entiende __repr__
para devolver una descripción en Python del objeto.
¡Los documentos le dicen a _wrap_ la clase de cadena no la subclase! Es decir, para hacer lo que usted desea, debe hacer que una clase herede de 'objeto' con un atributo que contenga el valor actual de la cadena. – katrielalex
[golpea la frente con la mano] ¡Oh! Gracias. Gracias. Haga una respuesta al comentario anterior (o agréguela a la existente) para poder aceptarla. Pensé que me estaba perdiendo algo obvio. – mwolfe02