我希望这个课程像列表一样。它的数据位于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)
答案 0 :(得分:8)
为什么不扩展列表类?然后你就拥有了所有内置的功能。
class population(list):
# custom methods here
请记住,不要引用列表的self.data
,而只需引用self
。
答案 1 :(得分:2)
def pop(self, index=-1) :
return self.data.pop(index)
这将实现预期的行为:
我会像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来实现建模,那么只需使用基类,或者使用包含和委托。
人口不仅仅是一个清单,它是什么?