[英]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()
的输出MyList
回MyList
。 这些函数被记录为始终(几乎)产生一个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.