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

結果:Pythonはリストでプロパティのセッターを飾る

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、 "8です"、" IX "])は、mL1オブジェクトの_myList属性を変更しません。問題を解決するにはどうすればよいですか?

+0

あなたはインデントを修正もらえますか?私は第二のフィクションがどこにインデントされるべきかわからない。 –

+0

あなたはどんな振る舞いを期待しているのかは分かりません。 'append()'は '_myList'に追加するべきです(値が最後に追加されないことを意味します)か' globalList'ですか?どちらの方法でも、戻り値が2つの他のリストを連結して生成された新しいリストであるため、これはうまくいかないことは明らかです。それを伸ばしても何とか戻ってくることはありません。 –

+0

append()は_myListに追加する必要があり、extend()も同様です – user14042

答えて

4

私はこのメソッドはappendを(定義)及び方法は、(拡張)のために:

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) 

それはちょうど約すべてで動作するはずですクラスオブジェクトそれぞれメンバー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']) 
+0

あなたの提案をThnak! – user14042

+1

コードは非常に壊れています:) MyListはsetterプロパティを壊すオブジェクトから派生しないので、myListに割り当てた後はプレーンなリストになります。これが修正されると、append()はすべての呼び出しに対して_mylistにglobalListを追加します。拡張実装も壊れていますが、_myListを拡張する必要があります。それ以外の場合は、プロパティによって返された一時的なリストだけが拡張されます。最後に、例ではmL1.extendの代わりにmL1.myList.extendを呼び出しています。 – user1346466

2

私はいくつかのメソッドlistをサブクラス化し、オーバーライドします:

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

こんにちは、答えをありがとう、それはあなたがそれを実装する方法を見て興味深いです。私はいくつかの簡単な質問をお願いします:self.other = otherまたは[]、短絡評価はここで使用されていますか?他のパラメータが指定されていない場合は、空のリストになりますか? – user14042

+0

@ user14042:そうです、もし 'other'が真実であれば(' None'や空のリストではない)、返されます。もしそうでなければ、反対側はなるでしょう。 – Blender

関連する問題