Как насчет просто к югу от причислять list
(главный пример для изменчивости в Python)?
class CharList(list):
def __init__(self, s):
list.__init__(self, s)
@property
def list(self):
return list(self)
@property
def string(self):
return "".join(self)
def __setitem__(self, key, value):
if isinstance(key, int) and len(value) != 1:
cls = type(self).__name__
raise ValueError("attempt to assign sequence of size {} to {} item of size 1".format(len(value), cls))
super(CharList, self).__setitem__(key, value)
def __str__(self):
return self.string
def __repr__(self):
cls = type(self).__name__
return "{}(\'{}\')".format(cls, self.string)
Это только соединение с списком возвращается к строке, если вы хотите распечатать ее или активно запросить представление строки. Мутирование и расширение тривиально, и пользователь знает, как это сделать, поскольку это всего лишь список.
Пример использования:
s = "te_st"
c = CharList(s)
c[1:3] = "oa"
c += "er"
print C# prints "toaster"
print c.list # prints ['t', 'o', 'a', 's', 't', 'e', 'r']
Ниже фиксируется, см обновление ниже.
Существует одно (разрешимое) предостережение: нет проверки (пока), что каждый элемент действительно является символом. По крайней мере, он будет печатать для всех, кроме строк. Тем не менее, те могут быть соединены и может вызвать странные ситуации, как это: [смотри пример кода ниже]
С обычаем __setitem__
, назначая строку длины = 1 к пункту CharList поднимет ValueError
!. Все остальное все еще можно свободно назначить, но при печати будет поднять TypeError: sequence item n: expected string, X found
в связи с операцией string.join()
. Если этого не достаточно, дополнительные проверки могут быть легко добавлены (потенциально также __setslice__
или переключая базовый класс для collections.Sequence
(производительность может отличаться ?!), ср here)
s = "test"
c = CharList(s)
c[1] = "oa"
# with custom __setitem__ a ValueError is raised here!
# without custom __setitem__, we could go on:
c += "er"
print C# prints "toaster"
# this looks right until here, but:
print c.list # prints ['t', 'oa', 's', 't', 'e', 'r']
Списки работают довольно хорошо для этого цель. –
Несколько ссылок: [LINK1] (http://mail.python.org/pipermail/tutor/2003-August/024485.html), [LINK2] (http://www.skymind.com/~ocrow/ python_string /) – digEmAll
Можете ли вы объяснить, почему вам нужны изменяемые строки? Что такое прецедент? –