2012-10-16 56 views
2

首先,我不知道这个问题最合适的标题是什么。竞争者:“如何在自定义类中实现list.append”。我有一个classIndividual。下面是类的相关部分:当你在列表中调用`append`时会发生什么?

from itertools import count 
class Individual: 
    ID = count() 
    def __init__(self, chromosomes): 
     self.chromosomes = list(chromosomes) 
     self.id = self.ID.next() 

这里就是我想和这个类的事:

想我实例化一个新的个体,没有染色体:indiv = Individual([])我想染色体加入到这个人稍后的。目前,我所要做的:

indiv.chromosomes.append(makeChromosome(params)) 

相反,我会非常喜欢做的事是:

indiv.append(makeChromosome(params)) 

具有同样的效果。

所以我的问题是这样的:当我在列表上调用append时,真正发生了什么?是否有被调用的__append__(或__foo__)?在我的Individual课程中实现该功能会让我获得所需的行为吗?

我知道,例如,我可以在Individual中实现__contains__以启用if foo in indiv功能。我将如何去启用indiv.append(…)功能?

回答

7

.append()很简单,就是有一个参数的方法,你可以很容易地定义一个自己:

def append(self, newitem): 
    self.chromosomes.append(newitem) 

无需魔术方法。

+0

该死!我显然得到隧道视野哈哈!不过,请你解释当我调用list.append时会发生什么? – inspectorG4dget

+1

@ inspectorG4dget:列表类型(在C中实现)定义了一个方法'.append()',该方法由解释器调用;它期待一个论点。该方法将元素添加到列表中。除了在C中实现,它没有什么神奇的。 –

+2

@ inspectorG4dget:查看['UserList'模块](http://hg.python.org/cpython/file/2.7/Lib/UserList.py)的来源,它将自定义类中的列表包装起来。 –

相关问题