2012-09-19 30 views
2

我希望能够在字符串strunicode中为字符添加属性,切断字符串并移动棋子,并使属性仍然存在于最后。如何设置和保留Python 2字符串中的字符属性?

这可能(和最好的)与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') 

感谢的想法!

回答

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__的来电者...这可以是很多工作。

+0

你必须重载任何方法 - Mine('a')+'a'会给你'aa'而不是Mine('aa')否则等 – lolopop

+0

@pythonm我们非常同意,这是很多工作。 –

+0

感谢您的答案!这不是一件容易的事。 – wodow

2

strunicode是内置类型,因此无论如何您都无法设置它们的属性。

class CustomString(str): pass 

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

这是针对str上的自定义属性。

但是,这仍然没有帮助,因为您仍然无法更改字符串,因为strunicode是不可变的。

你得到的唯一选择是使用bytearray s,这是可变的字节数组。不过,您必须手动编码unicode。 (你仍然必须继承它来分配属性!)