2

我希望能够为 astrunicode字符串中的字符添加属性,切断字符串并移动片段,并且属性仍然存在于末尾。

这是否可能(并且最好)使用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')

感谢您的想法!

4

2 回答 2

2

您可以尝试使用它作为启动器:

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__调用者的实例......这可能是很多工作。

于 2012-09-19T12:02:57.207 回答
2

str或者unicode是内置类型,因此您不能在不继承它们的情况下设置它们的属性。

class CustomString(str): pass

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

那是针对str.

但是,这仍然无济于事,因为您仍然无法更改字符串,因为str并且unicode是不可变的。

您得到的唯一选择是使用bytearrays,它是可变字节数组。不过,您必须手动编码 unicode。(并且您仍然必须对其进行子类化以分配属性!)

于 2012-09-19T12:03:32.257 回答