Python, декорирующий свойство setter со списком

globalList = [] class MyList: def __init__(self): self._myList = [1, 2, 3] @property def myList(self): return self._myList + globalList @myList.setter def myList(self, val): self._myList = val mL1 = MyList() print("myList: ", mL1.myList) mL1.myList.append(4) print("after appending a 4, myList: ", mL1.myList) mL1.myList.extend([5,6,"eight","IX"]) print("after extend, myList: ", mL1.myList) 

Результат:

 myList: [1, 2, 3] after appending a 4, myList: [1, 2, 3] after extend, myList: [1, 2, 3] 

Проблема, с которой я сталкиваюсь, заключается в том, что mL1.myList.append (4) и mL1.myList.extend ([5,6, "eight", "IX"]) не изменяют атрибут _myList в объекте mL1. Как я могу решить проблему?

2 Solutions collect form web for “Python, декорирующий свойство setter со списком”

Я определяю метод append () и метод extend () для объекта класса. Он соответственно добавляет член myList и расширяет член myList.

 global globalList globalList = [] class MyList(): def __init__(self): self._myList = [1, 2, 3] @property def myList(self): return self._myList + globalList @myList.setter def myList(self, val): self._myList = val def append(self, val): self.myList = self.myList + [val] return self.myList def extend(self, val): return self.myList.extend(val) mL1 = MyList() print("myList: ", mL1.myList) mL1.append(4) print("after appending a 4, myList: ", mL1.myList) mL1.myList.extend([5,6,"eight","IX"]) print("after extend, myList: ", mL1.myList) 

результат

 >>> ('myList: ', [1, 2, 3]) ('after appending a 4, myList: ', [1, 2, 3, 4]) ('after extend, myList: ', [1, 2, 3, 4, 5, 6, 'eight', 'IX']) 

Я бы включил list и отменил несколько методов:

 import itertools class ExtendedList(list): def __init__(self, other=None): self.other = other or [] def __len__(self): return list.__len__(self) + len(self.other) def __iter__(self): return itertools.chain(list.__iter__(self), iter(self.other)) def __getitem__(self, index): l = list.__len__(self) if index > l: return self.other[index - l] else: return list.__getitem__(self, index) 

Он должен работать практически со всем:

 In [9]: x = ExtendedList([1, 2, 3]) In [10]: x Out[10]: [1, 2, 3] In [11]: x.append(9) In [12]: x Out[12]: [9, 1, 2, 3] In [13]: x.extend([19, 20]) In [14]: x Out[14]: [9, 19, 20, 1, 2, 3] In [15]: sum(x) Out[15]: 54 
  • Ротация списка Python
  • Удаление элементов из списка при повторении без использования дополнительной памяти в Python
  • Как вернуть два значения из функции в Python?
  • Что следует учитывать перед списком подклассов?
  • Python: Получить список из списка
  • Numpy append: автоматически накладывать массив неправильного измерения
  • Использование .format () для форматирования списка с аргументами ширины поля
  • Как создать неизвестное количество переменных в python
  • Python - лучший язык программирования в мире.