Python:继承自内置列表类型VS过滤器,映射内置函数

时间:2013-07-29 10:56:12

标签: python subclass

我正在尝试基于内置列表类型构建一个类:

class MyList(list):

    def __getslice__(self, i, j):
        return MyList(
            super(MyList, self).__getslice__(i, j)
        )

    def __add__(self,other):
        return MyList(
            super(MyList, self).__add__(other)
        )

    def __mul__(self,other):
        return MyList(
            super(MyList, self).__mul__(other)
        )

    def __getitem__(self, item):
        result = super(MyList, self).__getitem__(item)
        try:
            return MyList(result)
        except TypeError:
            return result

我想知道是否有办法让MyList类与内置函数(如filter或map)一起工作。通过“使用”我的意思是使过滤器和映射返回MyList类对象而不是列表类型对象。

>>> a = MyList([1, 2, 3, 4])
>>> type(a)
<class '__main__.MyList'>
>>> b = filter(lambda this: this > 2, a)
>>> type(b)
<type 'list'>

我希望类型(b)返回与类型(a)返回相同的内容。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

不,您必须将filter()map()的输出转发回MyList。记录这些函数以产生list,(几乎)总是如此。如果您传递其他类型的序列,它们也会这样做。

引用map() documentation

  

iterable 参数可以是序列或任何可迭代对象;结果总是一个列表。

换句话说,filter()map()并不关心您传入的序列的确切类型,但不限于您的MyList类型。

例外是filter()tuple()str()的特殊情况;引用filter() documentation

  

如果iterable是字符串或元组,则结果也具有该类型;否则它总是一个列表。

此特殊处理是硬编码的,无法扩展。在Python 3中,此异常不再适用; map()filter()都会返回生成器

答案 1 :(得分:0)

您“可以”(不是说您应该)执行以下操作

_filter = filter
def filter(a,b):
    return MyList(filter(a,b))

答案 2 :(得分:0)

根据Jakob Bowyer的回答,你可以这样做:

__filter = filter
def filter(a, b):
    if isinstance(b, MyList):
        return MyList(__filter(a, b))
    else:
        return __filter(a ,b)

>>> a = MyList([1, 2, 3, 4])
>>> b = filter(lambda this: this > 2, a)
>>> type(b)
<class '__main__.MyList'>