繁体   English   中英

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

[英]Python: inherit from the built-in list type VS filter, map built-in functions

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

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)返回相同的结果。

有什么建议么?

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

引用map()文档

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

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

filter()是例外,它是tuple()str()特例; 引用filter()文档

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

这种特殊处理是硬编码的,无法扩展。 在Python 3中,此例外不再适用; map()filter()返回一个生成器

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

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

根据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'>    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM