簡體   English   中英

如何在Python 2字符串中設置和保留字符的屬性?

[英]How can I set and retain attributes on characters in a Python 2 string?

我希望能夠向strunicode字符串中的字符添加屬性,將字符串切碎並四處移動,並使屬性仍顯示在末尾。

strunicodebasestring的子類是否可能(最好)?

例:

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

感謝您的想法!

您可以嘗試將其用作入門工具:

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__ ……可能很多工作的。

strunicode是內置類型,因此如果不對它們進行子類化,就無法在它們上設置屬性。

class CustomString(str): pass

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

這是針對str上的自定義屬性。

但是,這仍然無濟於事,因為您仍然不能更改字符串,因為strunicode是不可變的。

您獲得的唯一選擇是使用bytearray ,它們是可變的字節數組。 不過,您必須手動編碼unicode。 (並且您仍然必須對其進行子類化以分配屬性!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM