2012-09-19 60 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。 (你仍然必須繼承它來分配屬性!)