当你在列表上调用`append`时会发生什么?

ins*_*get 2 python implementation class append

首先,我不知道这个问题的最合适的标题是什么.竞争者:"如何list.append在自定义类中实现".

class有个叫Individual.这是课程的相关部分:

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

这是我想要用这个类做的事情:

假设我实例化了一个没有染色体的新个体:indiv = Individual([])我想稍后为这个人添加染色体.目前,我必须这样做:

indiv.chromosomes.append(makeChromosome(params))
Run Code Online (Sandbox Code Playgroud)

相反,我理想的做法是:

indiv.append(makeChromosome(params))
Run Code Online (Sandbox Code Playgroud)

具有相同的效果.

所以我的问题是这样的:当我打电话append给一个清单时,真正发生了什么?是否有被调用的__append__(或__foo__)?在我Individual班上实现这个功能会让我得到理想的行为吗?

我知道,比如,我可以实现__contains__Individual启用if foo in indiv功能.我将如何进行启用indiv.append(…)功能?

Mar*_*ers 7

.append() 只是一个接受一个参数的方法,您可以自己轻松定义一个:

def append(self, newitem):
    self.chromosomes.append(newitem)
Run Code Online (Sandbox Code Playgroud)

不需要魔术方法.

  • @ inspectorG4dget:看一下[`UserList`模块]的源代码(http://hg.python.org/cpython/file/2.7/Lib/UserList.py),它将一个列表包装在一个自定义类中. (2认同)