Como conceder corda-ness na minha classe?
-
03-07-2019 - |
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?
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 .