Как даровать строчку моему классу?
Я хочу строку с одним дополнительным атрибутом, скажем, печатать ли она красным или зеленым цветом.
Подклассы (str) не работают, так как они неизменны. Я вижу ценность, но это может раздражать.
Может ли помочь множественное наследование? Я никогда не использовал это.
Наследование только объекта и использование self.value = str означает, что я должен сам реализовать все сообщения о строках (например, strip).
Или есть способ переслать их, как метод Ruby's missing_method?
Я думаю, что использование словаря уровня класса, индексируемого экземпляром, для хранения цвета может работать. Слишком уродливым?
5 ответов
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):
...
Обычно лучше использовать неизменяемые строки и их подклассы, но если вам нужна изменяемая строка, это самый простой способ получить ее.
Вам нужны все строковые методы, поэтому расширьте строку и добавьте свои дополнительные детали. Так что, если строка неизменна? Просто сделайте свой класс неизменным тоже. Тогда вы все равно создаете новые объекты, чтобы случайно не ошибиться, думая, что это изменчивый объект.
Или, если он есть в Python, расширьте изменяемый вариант строки. Я не достаточно знаком с Python, чтобы знать, существует ли такая структура.