[英]How can I set and retain attributes on characters in a Python 2 string?
我希望能夠向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')
感謝您的想法!
您可以嘗試將其用作入門工具:
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__
……可能很多工作的。
str
或unicode
是內置類型,因此如果不對它們進行子類化,就無法在它們上設置屬性。
class CustomString(str): pass
obj = CustomString('a')
obj.attr = 1 #works
''.attr = 1 #AttributeError
這是針對str
上的自定義屬性。
但是,這仍然無濟於事,因為您仍然不能更改字符串,因為str
和unicode
是不可變的。
您獲得的唯一選擇是使用bytearray
,它們是可變的字節數組。 不過,您必須手動編碼unicode。 (並且您仍然必須對其進行子類化以分配屬性!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.