2013-05-05 7 views
5
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) 

Wynik:Python seter nieruchomość zdobienia z listy

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

Problem jestem stoi to, że mL1.myList.append (4) i mL1.myList.extend ([5,6 ", osiem "," IX "]) nie modyfikuj atrybutu _myList w obiekcie mL1. Jak mogę zrobić, aby rozwiązać problem?

+0

mógłbyś naprawić wgniecenie? Nie jestem pewna, gdzie ma się wciskać druga fikcja. –

+0

Nie jest dla mnie jasne, jakie zachowanie można się spodziewać. Czy 'append()' należy dodać do '_myList' (co oznacza, że ​​wartości nie zostaną dodane do końca tak, jak można by oczekiwać) lub do' globalList'? Tak czy inaczej, jest całkiem jasne, że to nie zadziała, ponieważ zwrócona wartość jest nową listą utworzoną przez połączenie dwóch innych list. Rozszerzenie, które w jakiś sposób nie zmieni się z powrotem. –

+0

append() należy dodać do _myList, a także czy jest on rozszerzony() – user14042

Odpowiedz

4

I zdefiniować append() metoda i sposób rozszerzenia() dla obiekt klasy. Odpowiednio dołącza do członka myList i rozszerza listę 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) 

wynik jest

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

Zaspokuj cię za sugestię! – user14042

+1

Kod jest bardzo zepsuty :) MyList nie wywodzi się z obiektu, który przerywa właściwość ustawiającego, więc po przypisaniu do myList będzie to zwykła lista. Po ustaleniu, append() doda globalList do _listy dla każdego połączenia. Implementacja rozszerzenia również jest zepsuta, powinna rozciągać się na _myList, w przeciwnym razie rozszerzyłaby tylko listę tymczasową zwróconą przez właściwość. I na koniec przykład nazywa się mL1.myList.extend zamiast mL1.rozmiar. – user1346466

2

Chciałbym podklasy list i zastąpić kilka metod:

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) 

Należy pracować z niemal wszystko:

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 
+0

Cześć, dziękuję za odpowiedź, ciekawe, jak ją zaimplementujesz. Mam nadzieję, że nie przeszkadza mi to, że zadaję proste pytanie: self.other = other czy [], czy tutaj użyto oceny zwarciowej? więc jeśli drugi parametr nie zostanie podany, to będzie pusta lista? – user14042

+0

@ user14042: Tak, jeśli "other" jest prawdą (nie "None" lub pustą listą w tym przypadku), zostanie zwrócone. Jeśli nie, to druga strona będzie. – Blender