Python decorates setter property with list

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) 

Result:

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

The problem I am facing is that mL1.myList.append (4) and mL1.myList.extend ([5,6, "eight", "IX"]) do not change the _myList attribute in the mL1 object. How can i solve the problem?

+6
source share
2 answers

I define an append () method and an extend () method for a class object. It appends myList to the member and expands the myList member accordingly.

 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) 

result

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

I would subclass list and override several methods:

 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) 

It should work with almost everyone:

 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 
+2
source

Source: https://habr.com/ru/post/944299/


All Articles