2012-10-16 94 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)的來源,它將自定義類中的列表包裝起來。 –

相關問題