2011-08-24 32 views
4

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

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

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

你推荐哪种方法?

(*)的原因是: - 写在内部定义的方式 命令字符串 - 使字符串(如枚举的一部分),即抛出错误枚举范围

+0

你能解释一下你的基本知识是什么意思? – Ikke

+0

嗨,我的意思是http://docs.python.org/py3k/library/abc.html,特别是http://docs.python.org/py3k/library/collections.html#abcs-abstract -base-classes – Gerenuk

回答

2

这里的史蒂芬的回答愚蠢的,但很快,例如。它在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

为什么'__init__'而不是'__new__'的朴素方法不能工作? – Gerenuk

1

你外面比较值时,可以子类str,您不需要任何混入,因为您继承了str本身所需的所有内容。至于“数据”部分:因为你不是“模拟”一个字符串(这就是你使用的UserString),所以不需要单独的“数据”部分,使用字符串本身(即:像使用字符串一样使用self)。

(如果你的意思是别的东西:也许这个问题会通过显示重写的方法您(未遂)代码更清晰)

相关问题