【问题标题】:ABC for String?字符串的ABC?
【发布时间】:2023-03-29 13:27:02
【问题描述】:

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

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

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

您推荐哪种方法?

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

【问题讨论】:

标签: python string abstract-class abc


【解决方案1】:

这是 Steven 回答的一个愚蠢但快速的示例。它在 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'

【讨论】:

  • 为什么用__init__ 而不是__new__ 的幼稚方法不起作用`?
  • @Gerenuk 在这里有点晚了,但是:它不起作用,因为 str-inherited __new__ 方法不知道额外的 multiplier kw 参数 - 当它收到参数时,它不知道如何处理它。所以你必须自己处理。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多