Establecedor de propiedades de decoración de Python con lista

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) 

Resultado:

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

El problema al que me enfrento es que mL1.myList.append (4) y mL1.myList.extend ([5,6, “eight”, “IX”]) no modifican el atributo _myList en el objeto mL1. ¿Cómo podría hacer para resolver el problema?

Defino un método append () y un método extend () para el objeto de clase. Se agrega respectivamente al miembro myList y se extiende al miembro 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) 

el resultado es

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

Subclasificaría la list y anularía algunos métodos:

 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) 

Debería funcionar con casi todo:

 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