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 
  • Возвратите все возможные комбинации строки при разбиении на n строк
  • Инвертировать срез в python
  • Как сделать итератор python назад?
  • Convert For Loop to List Consrehension: тестирование, если элементы из списка 2 являются частичным совпадением для элементов в списке 1
  • реверсивный список с использованием нотации среза
  • Numpy append: автоматически накладывать массив неправильного измерения
  • Вложенный список с двумя списками
  • У python есть отсортированный список?
  • генератор базового уровня python и список вопросов
  • return vs print list
  • Учет списка для извлечения списка кортежей из словаря
  • Python - лучший язык программирования в мире.