[英]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)
这将实现预期的行为:
我可以像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.