Я не уверен, что реализация строкового подкласса здесь очень полезна. Мне кажется, что если вы обрабатываете поток, содержащий петабайты данных, всякий раз, когда вы создали ненужный объект, вы уже проиграли игру. Ваш первый приоритет должен состоять в том, чтобы игнорировать как можно больше входных данных.
Вы, конечно, могли бы создать строковый класс, который бы делал это:
class mystr(str):
def __init__(self, value):
self.value = value
self._decoded = None
@property
def decoded(self):
if self._decoded == None:
self._decoded = self.value.decode("hex")
return self._decoded
def __repr__(self):
return self.decoded
def __len__(self):
return len(self.decoded)
def __getitem__(self, i):
return self.decoded.__getitem__(i)
def __getslice__(self, i, j):
return self.decoded.__getslice__(i, j)
и так далее. Странная вещь в этом состоит в том, что если вы создаете подкласс str
, каждый метод, который вы не реализуете явно, будет вызываться со значением, переданным конструктору:
>>> s = mystr('a0a1a2')
>>> s
¡¢
>>> len(s)
3
>>> s.capitalize()
'A0a1a2'