Pergunta

Eu quero uma string com um atributo adicional, digamos que se deseja imprimir em vermelho ou verde.

Subclassing (str) não funciona, como é imutável. Eu ver o valor, mas pode ser irritante.

pode ajudar inheritence múltipla? Eu nunca usei isso.

Herdando único objeto e usando self.value = meios str eu tenho que implementar todas as mensagens String-ness (como faixa) eu mesmo.

Ou há uma maneira de transmitir a eles, como missing_method de Ruby?

Acho que usar um dicionário em nível de classe indexado por exemplo, para armazenar a cor poderia funcionar. Muito feio?

Foi útil?

Solução

str pode ser herdado a menos que você estiver usando uma versão muito antiga python, por exemplo:

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

Outras dicas

Talvez uma classe personalizada que contém uma corda seria uma abordagem melhor. Você realmente precisa para passar todos os métodos de cordas até a corda subjacente? Por que não exponha a corda através de uma propriedade e permitir que os consumidores da classe para fazer o que quiserem com ele?

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

Em geral, é melhor usar cordas imutáveis ??e subclasses do mesmo, mas se você precisar de um mutável esta é a maneira mais simples para obtê-lo.

Você precisa de todos os métodos de cordas, estique corda e adicione seus detalhes extras. Então, o que se string é imutável? Basta fazer a sua imutável classe, também. Então você está criando novos objetos de qualquer maneira para que você não vai acidentalmente estragar o pensamento de que é um objeto mutável.

Ou, se Python tem um, estender uma variante mutável da string. Eu sou o suficiente para não familiarizado com Python saber se essa estrutura existe.

Você pode tentar usar o stringlike módulo em PyPI . Aqui está um exemplo .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top