6

私は最近、コレクション内の抽象基本クラス (ABC) を発見し、その明確で体系的なアプローチと Mixin が好きです。カスタム文字列 (*) も作成したいのですが、文字列の ABC が見つかりませんでした。

UserStringはありますが、UserDictはだめだった!? str 自体から派生すると、Mixin はありませんか? オーバーライドされたメソッドで、文字列の「データ」部分にどのようにアクセスしますか?

どこかで、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で、必要なものはすべてそれ自体から継承するため、ミックスインは必要ありませんstr。「データ」部分については、文字列を「シミュレート」していないため(使用するものUserString)、別の「データ」部分は必要ありません。文字列自体を使用します(つまり、使用します)。self文字列を使用するように)。

(何か他のことを意味する場合:オーバーライドされたメソッドの(試行された)コードを表示することで、質問がより明確になる可能性があります)

于 2011-08-24T10:08:28.910 に答える