I recently discovered abstract base classes (ABCs) in collections and like their clear, systematic approach and Mixins. Now I also want to create customs strings (*), but I couldn't find an ABC for strings.
There is UserString, but UserDict was discouraged!? Deriving from str itself would have no Mixins? How would you access the "data" part of the string in overridden methods?
Somewhere I saw the suggestions to derive from Sequence and Hashable, but then I couldn't write if 'test' in my_string:
?!
Which approach do you recommend?
(*) The reasons are: - write strings that order in an internally defined way - make string (as part of an enumeration), that throw errors when comparing to values outside the enumeration scope
Here's a silly, but quick, example of Steven's answer. It's implemented in Python 3 (i.e. Unicode strings, super
without arguments, and __getitem__
slices):
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'