6

我最近在集合中发现了抽象基类 (ABC),并且喜欢它们清晰、系统的方法和 Mixin。现在我还想创建自定义字符串 (*),但我找不到字符串的 ABC。

有UserString,但不鼓励UserDict!?从 str 本身派生将没有 Mixins?您将如何在覆盖的方法中访问字符串的“数据”部分?

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

您推荐哪种方法?

(*) 原因是: - 编写以内部定义的方式排序的字符串 - 生成字符串(作为枚举的一部分),当与枚举范围之外的值进行比较时会引发错误

4

2 回答 2

4

这是史蒂文回答的一个愚蠢但快速的例子。它在 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'
于 2011-08-24T13:59:18.273 回答
1

你可以只继承子类str,你不需要任何 mixins,因为你从str它自己继承了你需要的一切。至于“数据”部分:由于您不是“模拟”字符串(这是您要使用UserString的),因此不需要单独的“数据”部分,请使用字符串本身(即:使用self就像你会使用一个字符串)。

(如果您的意思是别的:通过显示您(尝试的)覆盖方法的代码,问题可能会更清楚)

于 2011-08-24T10:08:28.910 回答