1

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

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 类与过滤器或映射等内置函数一起工作。通过“使用”我的意思是让过滤器和映射返回 MyList 类对象而不是列表类型对象。

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

我希望 type(b) 返回与 type(a) 返回相同的值。

有什么建议么?

4

3 回答 3

2

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

引用map()文档

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

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

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

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

这种特殊处理是硬编码的,不能扩展。在 Python 3 中,此异常不再适用;两者map()并在那里filter()返回一个生成器

于 2013-07-29T11:03:04.390 回答
0

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

_filter = filter
def filter(a,b):
    return MyList(filter(a,b))
于 2013-07-29T11:06:48.890 回答
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'>    
于 2013-07-29T11:18:39.557 回答