如何设置和保留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')。谢谢你的回答!这可不容易。