我希望能够为 astr
或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
s,它是可变字节数组。不过,您必须手动编码 unicode。(并且您仍然必须对其进行子类化以分配属性!)