2

strまたは文字列内の文字に属性を追加しunicode、文字列を切り刻んでピースを移動し、属性を最後に残しておくことができるようにしたいと思います。

strこれは、、unicodeまたはおそらくのサブクラスで可能(そして最良)basestringでしょうか?

例:

s = u"hello world"
s[6].foo = u'bar'
s2 = s.split(' ')
assert(s2 == u'world')
assert(s2[0].foo == u'bar')

考えてくれてありがとう!

4

2 に答える 2

2

あなたはそれをスターターとして使ってみることができます:

class Mine(unicode):
    #
    def __init__(self, *args, **kwargs):
        super(Mine, self).__init__(*args, **kwargs)
    #
    def __setattr__(self, attr, value):
        try:
            super(Mine, self).__setattr__(attr, value)
        except AttributeError:
            self.__dict__[attr] = value
    #
    def __getattr__(self, attr):
        try:
            super(Mine, self).__getattr__(attr)
        except AttributeError:
            try:
                return self.__dict__[attr]
            except KeyError:
                raise AttributeError

    def __getitem__(self, item):
        obj = Mine(super(Mine, self).__getitem__(item))
        obj.__dict__ = self.__dict__
        return obj

もちろん、特定のsplitメソッドを作成する必要があります。ここで、出力リストの各項目はMineオブジェクトになります。

def split(self, arg=' '):
    result = []
    for item in super(Mine, self).split(arg):
        i = Mine(item)
        i.__dict__ = self.__dict__
        result.append(i)
    return result

一般的な考え方は、親クラスのすべてのメソッド(少なくとも、本当に関心のあるメソッド)をオーバーロードして、クラスのインスタンスを返し、__dict__呼び出し元のインスタンスを継承することです...これは多くの場合があります仕事。

于 2012-09-19T12:02:57.207 に答える
2

strまたはunicode組み込み型であるため、とにかくサブクラス化せずに属性を設定することはできません。

class CustomString(str): pass

obj = CustomString('a')
obj.attr = 1 #works
''.attr = 1 #AttributeError

これは、のカスタム属性用ですstr

strただし、とunicodeは不変であるため、文字列を変更することはできないため、これでも役に立ちません。

取得する唯一のオプションはbytearray、可変バイト配列であるsを使用することです。ただし、Unicodeを手動でエンコードする必要があります。(属性を割り当てるには、サブクラス化する必要があります!)

于 2012-09-19T12:03:32.257 に答える