Python:我如何在这个类中实现'pop'?

时间:2009-09-07 21:09:20

标签: python

我希望这个课程像列表一样。它的数据位于self.data属性中。 如果我有一个实例,pp = population,定义__getitem__是否意味着我可以参考 pp而不是pp.data?或者它是__repr__的定义吗?    从列表而不是对象派生这个类会为我提供'pop'。 现在我需要实现'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)

4 个答案:

答案 0 :(得分:8)

为什么不扩展列表类?然后你就拥有了所有内置的功能。

class population(list):
    # custom methods here

请记住,不要引用列表的self.data,而只需引用self

答案 1 :(得分:2)

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

这将实现预期的行为:

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

我会像Evan Fosmark之前建议的那样将分类列入,但我可以看到没有这样做的充分理由。组合可以减轻低耦合,你可以完全控制它。但是你必须为你想要委派的所有方法编写桥梁,这可能很痛苦......

答案 2 :(得分:1)

  

如果我有一个实例,pp = population,定义__getitem__是否意味着我可以引用pp而不是pp.data?

基本上,是的。添加__getitem__方法相当于在某些其他语言中重载[]运算符。因此,以下两个是等价的:

pp.data[0]
pp[0]
  

或者它是__repr__的定义吗?

定义__repr__将为您提供对象的字符串表示。因此,这两个调用是等价的:

repr(pp.data)
repr(pp)
  

从list而不是object派生这个类会为我提供'pop'。

从我现在看到的,继承自列表可能是要走的路。除非我遗漏了什么,否则唯一不同的是排序方法和副本。其他一切都是一样的。

答案 3 :(得分:1)

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

我尝试为那些真实的事物保存继承关系。表单是一个窗口,一个对话框是一个表单,等等。如果你只是使用a来实现建模,那么只需使用基类,或者使用包含和委托。

人口不仅仅是一个清单,它是什么?