Как даровать строчку моему классу? - PullRequest
6 голосов
/ 04 мая 2009

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

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

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 04 мая 2009

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
2 голосов
/ 04 мая 2009
import UserString
class mystr(UserString.MutableString):
   ...

Обычно лучше использовать неизменяемые строки и их подклассы, но если вам нужна изменяемая строка, это самый простой способ получить ее.

2 голосов
/ 04 мая 2009

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

0 голосов
/ 03 августа 2012

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

0 голосов
/ 04 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...