2013-05-05 8 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) 

Ergebnis:Python Dekoration Eigenschaft Setter mit Liste

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

Das Problem, das ich bin vor ist, dass mL1.myList.append (4) und mL1.myList.extend ([5,6, "acht "," IX "]) ändern nicht das _myList-Attribut im mL1-Objekt. Wie kann ich das Problem lösen?

+0

Könnten Sie den Einzug beheben? Ich bin mir nicht sicher, wo die zweite Fiktion einzuordnen ist. –

+0

Es ist mir nicht klar, welches Verhalten Sie erwarten würden. Sollte 'append()' zu '_myList' hinzufügen (was bedeutet, dass die Werte nicht am Ende hinzugefügt werden, wie man es erwarten würde) oder zu' globalList'? Wie auch immer, es ist ziemlich klar, dass dies nicht funktionieren würde, da der zurückgegebene Wert eine neue Liste ist, die durch Verketten zweier anderer Listen erzeugt wird. Erweiterung, die nicht irgendwie zurück modifizieren wird. –

+0

append() sollte zu _myList hinzugefügt werden, und so extend() – user14042

Antwort

4

definiere ich eine Methode append() und ein Verfahren extend() für das Klassenobjekt. Es hängt jeweils an Mitglied myList und erweitert Mitglied 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) 

Ergebnis ist

>>> 
('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

Thnak Sie für den Vorschlag! – user14042

+1

Der Code ist sehr kaputt :) MyList leitet nicht von Objekt ab, was die Setter-Eigenschaft unterbricht, also wird nach dem Zuweisen zu myList eine einfache Liste sein. Sobald dies behoben ist, fügt append() für jeden Aufruf globalList zu _mylist hinzu. Die extend-Implementierung ist ebenfalls unterbrochen, sie sollte _myList erweitern, andernfalls würde sie nur die temporäre Liste erweitern, die von der Eigenschaft zurückgegeben wird. Und zuletzt ruft das Beispiel mla1.myList.extend anstatt m1.extend auf. – user1346466

2

würde ich Unterklasse list und außer Kraft setzen ein paar Methoden:

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) 

Es sollte mit so gut wie alles funktioniert:

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

Hallo Danke für die Antwort, es ist interessant zu sehen, wie Sie es implementieren. Ich hoffe, es macht Ihnen nichts aus, wenn ich eine einfache Frage stelle: self.other = other oder [], wird die Kurzschlussauswertung hier verwendet? Wenn also der andere Parameter nicht angegeben wird, wird es eine leere Liste sein? – user14042

+0

@ user14042: Ja, wenn 'andere' truthy ist (nicht' None' oder eine leere Liste in diesem Fall), wird es zurückgegeben. Wenn nicht, wird die andere Seite sein. – Blender

Verwandte Themen