如何设置和保留Python 2字符串中字符的属性?
我希望能够为如何设置和保留Python 2字符串中字符的属性?,python,string,Python,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):
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
一般的想法是重载父类的每个方法(至少是您真正感兴趣的方法),以便它返回类的一个实例并继承调用方的
\uu dict\uu
。。。这可能需要大量的工作。您可以尝试将其用作启动程序:
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
一般的想法是重载父类的每个方法(至少是您真正感兴趣的方法),以便它返回类的一个实例并继承调用方的
\uu dict\uu
。。。这可能需要大量的工作。str
或unicode
都是内置类型,因此您无法在没有子类化的情况下对它们设置属性
class CustomString(str): pass
obj = CustomString('a')
obj.attr = 1 #works
''.attr = 1 #AttributeError
这适用于str
上的自定义属性
但是,这仍然没有帮助,因为您仍然无法更改字符串,因为str
和unicode
是不可变的
唯一的选择是使用
bytearray
s,它们是可变字节数组。不过,您必须手动编码unicode。(您仍然需要对其进行子类化以分配属性!)str
或unicode
是内置类型,因此您无法在未对其进行子类化的情况下对其设置属性
class CustomString(str): pass
obj = CustomString('a')
obj.attr = 1 #works
''.attr = 1 #AttributeError
这适用于str
上的自定义属性
但是,这仍然没有帮助,因为您仍然无法更改字符串,因为str
和unicode
是不可变的
唯一的选择是使用
bytearray
s,它们是可变字节数组。不过,您必须手动编码unicode。(您仍然需要将其子类化以分配属性!)您必须重载任何方法-Mine('a')+'a'将为您提供'aa',而不是Mine('aa'),否则,等等。感谢您的回答!这不是一个简单的方法。你必须重载任何方法-我的('a')+'a'将给你'aa',否则不是我的('aa')。谢谢你的回答!这可不容易。