2009-05-04 13 views
6

Quiero una cadena con un atributo adicional, digamos si se imprime en rojo o verde.¿Cómo otorgar cadena en mi clase?

La subclasificación (str) no funciona, ya que es inmutable. Veo el valor, pero puede ser molesto.

¿Puede la herencia múltiple ayudar? Nunca usé eso.

Heredar único objeto y usar self.value = str significa que tengo que implementar todos los mensajes de cadena (como strip) yo mismo.

¿O hay alguna forma de reenviarlos, como el método de falta de Ruby?

Creo que el uso de un diccionario de nivel de clase indexado por instancia para almacenar el color podría funcionar. ¿Muy feo?

Respuesta

6

str puede ser heredada a menos que esté utilizando una versión pitón muy antiguo, por ejemplo:

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

Esto es bueno. Pero debes tener cuidado con este enfoque. Si realizó alguna operación de cuerda como (título(), +, ...) el resultado será de tipo str no A. –

+0

Tenía la impresión de que precisamente esto NO funcionaría, de ahí la pregunta. Resulta que fue un error de pogramación en mi __new__ y malinterpreté el mensaje inadecuado de Python. – Tobias

2

Quizás una clase personalizada que contiene una cadena sería una mejor opción. ¿De verdad necesitas pasar todos los métodos de cadena a la cadena subyacente? ¿Por qué no exponer la cuerda a través de una propiedad y permitir que los consumidores de la clase hagan lo que quieran?

0

Necesita todos los métodos de cadena, por lo que amplíe la cadena y agregue los detalles adicionales. Entonces, ¿qué pasa si la cuerda es inmutable? Simplemente haz que tu clase sea inmutable también. Entonces estás creando nuevos objetos de todos modos para que no te equivoques accidentalmente pensando que es un objeto mutable.

O, si Python tiene una, extienda una variante mutable de cadena. No estoy lo suficientemente familiarizado con Python para saber si existe tal estructura.

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

Por lo general es mejor utilizar cadenas inmutables & subclases del mismo, pero si usted necesita un ser mutable este es la forma más sencilla de obtenerlo.

+0

Esto está en desuso desde python 2.2 –

+0

La clase UserString quedó obsoleta en 2.2, pero la clase MutableString solo quedó en desuso en 2.6 - vea http://docs.python.org/library/userdict.html - si está seguro vas a utilizar 2.6 o posterior, se puede implementar una cadena mutable sobre el nuevo tipo bytearray (matriz mutable de bytes) –

0

Puede intentar usar el módulo stringlike en PyPI. Aquí está an example.

Cuestiones relacionadas