Chciałbym móc dodać atrybuty do znaków w ciągu {X0}} lub unicode, posiekaj ciąg i przenieś kawałki, a atrybuty nadal znajdują się na końcu.

Czy byłoby to możliwe (i najlepiej) z podklasą str, unicode lub ewentualnie basestring?

Przykład:

s = u"hello world"
s[6].foo = u'bar'
s2 = s.split(' ')
assert(s2 == u'world')
assert(s2[0].foo == u'bar')

Dzięki za myśli!

2
wodow 19 wrzesień 2012, 15:47

2 odpowiedzi

Najlepsza odpowiedź

Możesz spróbować użyć tego jako startera:

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

Oczywiście musisz utworzyć specyficzny metodę {X0}}, gdzie każdy element listy wyjściowej będzie obiekt 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

Generic Idea jest przeciążenie każdej metody pojedynczej metody klasy nadrzędnej (przynajmniej te, które naprawdę jesteś zainteresowany), aby zwróci instancję swojej klasy i dziedziczy __dict__ dzwoniącego ... to może być dużo pracy.

2
Pierre GM 19 wrzesień 2012, 12:09

str lub unicode są wbudowane typy, więc nie można ustawić na nich atrybuty bez ich podklania.

class CustomString(str): pass

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

To jest dla niestandardowych atrybutów na str.

Jednak to nadal nie pomaga, ponieważ nadal nie można zmienić ciągów, ponieważ str i unicode są niezmienne.

Jedyną opcją, którą otrzymujesz, jest użycie bytearray s, które są mutowalnymi tablicami bajtów. Musisz ręcznie zakodować Unicode. (I nadal musisz podklasy, aby przypisać atrybuty!)

2
lolopop 19 wrzesień 2012, 12:03