繁体   English   中英

Python:如何在此类中实现“ pop”?

[英]Python: how do I implement 'pop' in this class?

我希望这堂课像一个清单一样。 它的数据驻留在属性self.data中。 如果我有一个实例pp =人口,那么定义__getitem__意味着我可以引用pp而不是pp.data? 还是执行__repr__的定义? 从列表而不是对象派生此类将为我提供“流行音乐”。 现在,我需要实现“流行”方法。 谢谢

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)

为什么不只是扩展列表类? 然后,您将内置所有这些功能。

class population(list):
    # custom methods here

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

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

这将实现预期的行为:

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

我可以像Evan Fosmark之前建议的那样将List细分为子类,但是我可以看到不这样做的充分理由。 合成可以缓解低耦合,您可以完全控制它。 但是您必须为要委派的所有方法编写桥,这可能会很麻烦...

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

从本质上讲,是的。 添加__getitem__方法等效于重载某些其他语言中的[]运算符。 因此,以下两个等效:

pp.data[0]
pp[0]

还是执行__repr__的定义?

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

repr(pp.data)
repr(pp)

从列表而不是对象派生此类将为我提供“流行音乐”。

从我现在所看到的,从列表继承可能是要走的路。 除非我缺少任何内容,否则唯一的不同就是排序方法和复制。 几乎所有其他内容都是相同的。

这是真正的事情的清单 ,或者你使用列表存储了一堆东西? 从列表继承之前,为什么不只使用列表呢?

我尽力为真正的is-a关系保存继承。 一个Form是一个窗口,一个Dialog是一个Form,等等。如果您只是使用a来实现建模,那么只需使用基类,或者使用包含和委派。

不仅仅是列表的人口有什么意义?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM