Вопрос

Я хочу строку с одним дополнительным атрибутом, скажем, печатать ли ее красным или зеленым цветом.

Подклассы (str) не работают, так как они неизменны. Я вижу значение, но это может раздражать.

Может ли помочь множественное наследование? Я никогда не использовал это.

Наследование только объекта и использование self.value = str означает, что я должен сам реализовать все сообщения о строках (например, strip).

Или есть способ переслать их, например метод Ruby's missing_method?

Я думаю, что использование словаря уровня класса, индексируемого экземпляром, для хранения цвета может сработать. Слишком некрасиво?

Это было полезно?

Решение

str может быть унаследован, если вы не используете очень старую версию Python, например:

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

Другие советы

Возможно, лучше использовать пользовательский класс, который содержит строку. Вы действительно должны передать все строковые методы до базовой строки? Почему бы не раскрыть строку через свойство и позволить потребителям класса делать с ней все, что они пожелают?

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

Как правило, лучше использовать неизменяемые строки & amp; его подклассы, но если вам нужен изменяемый, это самый простой способ получить его.

Вам нужны все методы строки, поэтому расширьте строку и добавьте дополнительные данные. Так что, если строка неизменна? Просто сделайте свой класс неизменным тоже. Тогда вы все равно создаете новые объекты, чтобы случайно не ошибиться, думая, что это изменяемый объект.

Или, если он есть в Python, расширьте изменяемый вариант строки. Я не достаточно знаком с Python, чтобы знать, существует ли такая структура.

Вы можете попробовать использовать модуль stringlike в PyPI . Вот пример .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top