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

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 に答える