Форум сайта python.su
В чём смысл присутствия декоратора delegate и как это вообще использовать ?
attribute_name = '' def delegate(attribute_name, method_names): def decorator(cls): global attribute_name if attribute_name.startswith("__"): attribute_name = "_" + cls.__name__ + attribute_name setattr(cls, name, eval("lambda self, *a, **kw: " "self.{0}.{1}(*a, **kw)".format( attribute_name, name))) return cls return decorator _identity = lambda x: x @delegate("__list", ("pop", "__delitem__", "__getitem__", "__iter__", "__reversed__", "__len__", "__str__")) class SortedList(object): def __init__(self, sequence=None, key=None): self.__key = key or _identity assert hasattr(self.__key, "__call__") if sequence is None: self.__list = [] elif (isinstance(sequence, SortedList) and sequence.key == self.__key): self.__list = sequence.__list[:] else: self.__list = sorted(list(sequence), key=self.__key) @property def key(self): return self.__key def __bisect_left(self, value): key = self.__key(value) left, right = 0, len(self.__list) while left < right: middle = (left + right) // 2 if self.__key(self.__list[middle]) < key: left = middle + 1 else: right = middle return left def add(self, value): index = self.__bisect_left(value) if index == len(self.__list): self.__list.append(value) else: self.__list.insert(index, value) def remove(self, value): index = self.__bisect_left(value) if index < len(self.__list) and self.__list[index] == value: del self.__list[index] else: raise ValueError("{0}.remove(x): x not in list".format( self._class__.__name__)) def remove_every(self, value): count = 0 index = self.__bisect_left(value) while(index < len(self.__list) and self.__list[index] == value): del self.__list[index] count += 1 return count def count(self, value): count = 0 index = self.__bisect_left(value) while(index < len(self.__list) and self.__list[index] == value): del self.__list[index] index += 1 count += 1 return count def index(self, value): index = self.__bisect_left(value) if index < len(self.__list) and self.__list[index] == value: return index raise ValueError("{0}.index(x): x not in list".format( self.__class__.__name__)) def __delitem__(self, index): del self.__list[index] def __getitem__(self, index): return self.__list[index] def __setitem__(self, index): raise TypeError("use add() to insert a value and rely on " "the list to put it in the right place") def iter(self): return iter(self.__list) def __reversed__(self): return reversed(self.__list) def __contains__(self, value): index = self.__bisect_left(value) return (index < len(self.__list) and self.__list[index] == value) def clear(self): self.__list = [] def pop(self, index=-1): return self.__list.pop(index) def __len__(self): return len(self.__list) def __str__(self): return str(self.__list) def copy(self): return SortedList(self, self.__key) __copy__ = copy letters = SortedList(("H", "c", "B", "G", "e"), str.lower) print str(letters) letters.add("G") letters.add("f") letters.add("A") print str(letters) print letters[2] print '----------' letters.pop() print letters # Press ENTER or type command to continue # ['B', 'c', 'e', 'G', 'H'] # ['A', 'B', 'c', 'e', 'f', 'G', 'G', 'H'] # c # ---------- # ['A', 'B', 'c', 'e', 'f', 'G', 'G'] # Press ENTER or type command to continue
Отредактировано remoshka (Дек. 23, 2014 22:26:58)
Офлайн
1
remoshka
remo from pythonua@c.j.r ?
Офлайн
72
remoshkaСмысл в создании декоратором в декорируемом классе пачки методов, в данном случае “pop”, “__delitem__”, “__getitem__”, “__iter__”, “__reversed__”, “__len__”, “__str__”, которые вызывают одноименные методы у атрибута класса, в данном случае __list.
В чём смысл присутствия декоратора delegate и как это вообще использовать ?
Отредактировано PooH (Дек. 25, 2014 05:01:36)
Офлайн