2009-09-07 58 views
1

我希望这个课程能像列表一样行事。它的数据驻留在属性self.data中。 如果我有一个实例,pp = population,是否定义为__getitem__意味着我可以参考 pp而不是pp.data?或者它是否定义了__repr__这样做? 从列表而不是对象派生出这个类为我提供'流行'。 现在我需要实现'pop'方法。谢谢Python:如何在这个类中实现'pop'?

class population (object): 
def __init__ (self): 
    self.data = [] 

def append(self, item): 
    self.data.append(item) 

def extend(self, item): 
    self.data.extend(item) 

def sort(self): 
    self.data.sort(cmp=fitnesscompare) 

def __getitem__(self, index): return self.data[index] 

def __setitem__(self, index, item): self.data[index] = item 

def __len__(self): return len(self.data) 

def __repr__(self): return repr(self.data) 

def copy(self): 
    return copy.deepcopy(self) 

回答

7

为什么不只是扩展列表类?然后,你把所有的内置该功能。

class population(list): 
    # custom methods here 

只要记住,而不是引用self.data的名单,只是参考self

+0

是的,这表现很好。我不得不添加'复制'方法,谢谢 – 2009-09-07 22:40:39

2
def pop(self, index=-1) : 
    return self.data.pop(index) 

这将实现预期的行为:

  • 回报,如果没有索引传递的最后一个项目;
  • 如果通过,则返回“index”处的项目;
  • 将使用底层pop()的类型检查;
  • 将引发与底层pop()相同的异常。

我会有Evan Fosmark之前建议的分类列表,但我可以看到不这样做的很好理由。成分可以减轻低耦合,并且您可以完全控制它。但是你必须为所有你想委托的方法写桥梁,这可能是一种痛苦......

+0

我会试试这个。我分类人口(名单)。它的一个实例有一些本身不可迭代的“染色体”类实例的集合。但是当我尝试'instOfPopulation.pop()'我得到“TypeError:'染色体'对象是不可迭代的” – 2009-09-07 23:54:49

+0

我真的不知道出了什么问题,子类或我的解决方案?而且电影方面,没有fosmark解决方案的工作?在这种情况下,它应该被接受。 – 2009-09-08 10:51:01

+0

我仍然无法在人口阶层上使用'pop()'。当我尝试使用你的方法时,出现以下错误消息:“文件”C:\ Python26 \ Code \ OO.py“,第201行,在弹出返回self.pop(索引)”并滚动直到“最大递归深度突破”。我难以理解为什么列表不会弹出()它的内容并返回一个错误,说明内容本身不可迭代。我是新来的stackoverflow,并没有意识到我应该接受一个答案。我可以按照fosmark的建议列出子列表,但我仍然无法在人口中实现'pop()' – 2009-09-08 13:39:00

1

If I have an instance, pp = population, does defining __getitem__ mean I can refer to pp instead of pp.data?

本质上是的。添加一个__getitem__方法等效于在其他语言中重载[]运算符。因此,下面两个是等价的:

pp.data[0] 
pp[0] 

Or is it the defining of __repr__ that does that?

定义__repr__会给你对象的字符串表示。因此,这两个调用是等价的:

repr(pp.data) 
repr(pp) 

Would deriving this class from list instead of object provide me with 'pop'.

从我现在看到,从名单继承可能是要走的路。除非我错过了一些东西,唯一不同的是排序方法和复制。其他一切都是一样的。

+0

谢谢,这清理了很多 – 2009-09-07 23:48:27

1

这真的是列表的东西,还是你用列表来存储一堆东西?在从列表继承之前,为什么不使用列表?

我尝试为真实的东西保存继承关系。一个窗体是一个窗口,一个对话框是一个窗体等等。如果你只是建模is-implemented-using-a,那么只需使用基类,或者使用包含和委派。

这是什么关于人口不仅仅是一个列表?