2013-05-05 44 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