Азбука для строки? - PullRequest
       34

Азбука для строки?

5 голосов
/ 24 августа 2011

Я недавно обнаружил абстрактные базовые классы (ABC) в коллекциях, и мне нравится их ясный, систематический подход и миксины.Теперь я также хочу создать таможенные строки (*), но не могу найти ABC для строк.

Существует UserString, но UserDict не рекомендуется !?Исходя из самой ул, не будет миксинов?Как бы вы получили доступ к части «data» строки в переопределенных методах?

Где-то я видел предложения по наследованию от Sequence и Hashable, но тогда я не мог написать if 'test' in my_string:?!

Какой подход вы рекомендуете?

(*) Причины таковы: - записать строки, которые упорядочены внутренним образом - создать строку (как часть перечисления), которая выдает ошибки при сравнении со значениями внеобласть перечисления

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Вот глупый, но быстрый пример ответа Стивена. Это реализовано в Python 3 (то есть строки Unicode, super без аргументов и __getitem__ фрагменты):

class MultiStr(str):
    def __new__(cls, string, multiplier=1, **kwds):
        self = super().__new__(cls, string, **kwds)
        self.multiplier = multiplier
        return self

    def __getitem__(self, index):
        item = super().__getitem__(index)
        return item * self.multiplier

>>> s = MultiStr(b'spam', multiplier=3, encoding='ascii')
>>> s[0]
'sss'
>>> s[:2]
'spspsp'
>>> s[:]
'spamspamspam'
1 голос
/ 24 августа 2011

Вы можете просто создать подкласс str, вам не понадобятся миксины, потому что вы наследуете все, что вам нужно, от самого str. Что касается части «данные»: поскольку вы не «имитируете» строку (для которой вы бы использовали UserString), нет необходимости в отдельной части «данные», используйте саму строку ( is: используйте self, как если бы вы использовали строку).

(если вы имеете в виду что-то другое: возможно, вопрос был бы более понятен, если показать ваш (попытанный) код для переопределенных методов)

...