我正在尝试基于内置列表类型构建一个类:
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)返回相同的内容。
有什么建议吗?
答案 0 :(得分:2)
不,您必须将filter()
或map()
的输出转发回MyList
。记录这些函数以产生list
,(几乎)总是如此。如果您传递其他类型的序列,它们也会这样做。
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'>