ABC for String?

时间:2011-08-24 08:50:14

标签: python string abstract-class abc

我最近在集合中发现了抽象基类(ABCs),就像它们清晰,系统的方法和Mixins一样。现在我也想创建海关字符串(*),但我找不到字符串的ABC。

有UserString,但不建议使用UserDict!?从str本身派生没有Mixins?如何在重写方法中访问字符串的“数据”部分?

某处我看到了从Sequence和Hashable派生的建议,但后来我写不出if 'test' in my_string:?!

您推荐哪种方法?

(*)原因是: - 编写以内部定义的方式排序的字符串 - make string(作为枚举的一部分),在与枚举范围之外的值进行比较时抛出错误

2 个答案:

答案 0 :(得分:3)

这是史蒂文答案的一个愚蠢而快速的例子。它在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 :(得分:1)

你可以只是str的子类,你不需要任何mixin,因为你从str本身继承了你需要的一切。至于“数据”部分:因为你没有“模拟”一个字符串(你使用的是UserString),所以不需要单独的“数据”部分,使用字符串本身(即:使用self,因为您将使用字符串)。

(如果你的意思是其他的话:通过显示被覆盖的方法的(尝试的)代码可能会更清楚)