2013-05-05 45 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,「八「,」IX「])不會修改mL1對象中的_myList屬性。我怎麼能解決這個問題?

+0

你能解決這個缺口?我不確定第二部小說的意圖在哪裏進行。 – 2013-05-05 01:33:32

+0

我不清楚你會期望什麼樣的行爲。應該將'append()'添加到'_myList'(意味着值不會像期望的那樣添加到結尾)或'globalList'?無論哪種方式,很明顯,這是行不通的,因爲返回的值是通過連接兩個其他列表產生的新列表。擴展它不會以某種方式修改回來。 – 2013-05-05 01:33:38

+0

append()應該添加到_myList,那麼extend() – user14042 2013-05-05 01:34:52

回答

4

我定義的方法追加()和方法擴展()爲:

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 2013-05-17 20:17:28

+1

代碼高度破壞:) MyList不會從對象中派生出來,這會破壞setter屬性,所以在分配給myList之後,它將成爲一個普通列表。一旦解決了這個問題,append()會爲每個調用添加globalList到_mylist。擴展實現也被破壞了,它應該擴展_myList,否則它只會擴展屬性返回的臨時列表。最後一個例子是調用mL1.myList.extend而不是mL1.extend。 – user1346466 2015-12-18 10:58:02

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 2013-05-05 02:10:46

+0

@ user14042:是的,如果'other'是真的(在這種情況下不是'None'或一個空列表),它將被返回。如果不是,另一方會。 – Blender 2013-05-05 02:18:22