0

问题

在 python 2.7 中,我想创建一个自定义列表,通过预先填充一些静态元素来扩展 python 列表。我还想通过添加一些自定义方法(即过滤、重新初始化等...)来扩展 python 列表。

例如:

my_list = FitFuctionsList()

应该给我一个已经填充了一些固定元素的列表。

我试图从 python 继承list

class FitFuctionsList(list):
    def __init__(self):
        list.__init__(['some', 'fixed', 'list'])

但初始化失败(返回一个空列表)。

也欢迎就替代方法提出建议。

解决方案总结

nachshon提供了一个可行的解决方案,尽管他没有解释它为什么起作用(以及为什么前面的例子没有):

class FitFuctionsList(list):
    def __init__(self):
        super(FitFuctionsList, self).__init__(['some', 'fixed', 'list'])

如果只需要用固定值初始化列表(没有自定义方法),Claudiu提供了一种巧妙的方法,使用带有属性的辅助函数来初始化列表。这种方法优雅而健壮,因为它避免使用全局变量

def FitFuctionsList():
    return list(FitFuctionsList.prefilled_elements)
FitFuctionsList.prefilled_elements = ["a", "b", "rofl"]
4

3 回答 3

1

您可以像这样从列表继承:

类 FitFunctionsList(列表):

  def __init__(self, *args, **kwargs):
     super(FitFunctionsList, self).__init__(['some','default','values'])
  def my_custom_filter(self, criteria):
     pass`

这将使用默认值初始化列表,您可以将其视为列表,并且可以添加自定义方法。

回应@user2304916 对此答案的评论:

list.__init__(self, ['some','default','values']) 

应该可以工作,但是 super 返回一个对象,该对象将允许您访问所有继承的东西,在多重继承的情况下,它将使您能够以正确的顺序访问所有方法。它也不需要您指定从您继承的哪个类称为父方法。

于 2013-09-23T22:21:53.690 回答
1

似乎这里最简单的解决方案是一个辅助函数,比如......

prefilled_elements = ["a", "b", "rofl"]
def FitFuctionsList():
    return list(prefilled_elements)

编辑:如果您不想prefilled_elements成为全球性的,您可以执行以下操作:

def FitFuctionsList():
    return list(FitFuctionsList.prefilled_elements)
FitFuctionsList.prefilled_elements = ["a", "b", "rofl"]

但是对于您更新的自定义方法问题,您必须list按照nachson的演示进行子类化。

于 2013-09-23T22:07:28.503 回答
0

您可以按照以下方式做一些事情:

class FitFunctionList(list):
    def __init__(self, **kwargs):
        if 'func' in kwargs:
            self.func=kwargs['func']
        else:
            self.func=range

        if 'args' in kwargs:
            self.args=kwargs['args']
        else:
            self.args=10

        super(FitFunctionList, self).__init__(self.func(self.args))

def test_func(arg):
    return [i*i for i in range(arg)]     


print FitFunctionList() 
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print FitFunctionList(func=test_func, args=6) 
# [0, 1, 4, 9, 16, 25]
于 2013-09-23T22:30:02.957 回答