17

私は最近、私が抱えていたコーディングの問題を調べていて、コードを見ている誰かが、サブクラス化リストが悪いと言っていました (私の問題はそのクラスとは無関係でした)。彼はあなたがそれをするべきではなく、それには多くの悪い副作用が伴うと言った. これは本当ですか?

リストが一般的にサブクラス化するのに悪いかどうか、もしそうなら、その理由は何ですか. または、Python でリストをサブクラス化する前に何を考慮する必要がありますか?

4

4 に答える 4

18

モジュールで提供される抽象基本クラス、特には、リストのようなクラスを実装するときに役立ちます。これらは Python 2.6 以降で使用できます。collectionsMutableSequence

ABC を使用すると、クラスの「コア」機能を実装でき、定義した内容に論理的に依存するメソッドが提供されます。

たとえば、 、、およびその他のメソッドをクラスに提供する__getitem__には、 のcollections.Sequence派生クラスで実装するだけで十分です。__contains____iter__

複雑な作業を行うために、含まれているリスト オブジェクトを使用することもできます。

于 2010-10-15T20:57:04.423 に答える
15

サブクラス化する利点はありませんlistどのメソッドもオーバーライドするメソッドを使用しないため、予期しないバグが発生する可能性があります。self.appendさらに、データにアクセスする代わりに、またはデータにアクセスする代わりにself.foos.append、特にそうするのself[4]ではなく、混乱を招くことがよくありself.foos[4]ます。をサブクラス化するだけで、リストとまったく同じように機能するもの、または (より良い)ただし本当に必要なobjectリストのように機能するものを作成できます。

于 2010-10-15T23:02:18.557 に答える
11

私が自問する最初の質問は、「私の新しいオブジェクトは本当にリストですか?」ということだと思います。それはリストのように歩き、リストのように話しますか? それとも何か他のものですか?

リストの場合は、すべての標準リスト メソッドがすべて意味をなすはずです。

標準のリスト メソッドが意味をなさない場合、オブジェクトにはリストではなく、リストが含まれている必要があります。

古い python (2.2?) では、サブクラス化リストはさまざまな技術的な理由から悪い考えでしたが、最新の python では問題ありません。

于 2010-10-15T20:39:26.790 に答える
6

ニックは正しいです。また、Pythonと話すことはできませんが、他のオブジェクト指向言語(Java、Smalltalk)では、リストをサブクラス化することはお勧めできません。一般に、継承は避け、代わりに委任構成を使用する必要があります。

むしろ、コンテナクラスを作成し、リストへの呼び出しを委任します。コンテナクラスにはリストへの参照があり、独自のメソッドでリストの呼び出しと戻り値を公開することもできます。これにより柔軟性が増し、コードを壊すことなく、後で実装(異なるリストタイプまたはデータ構造)を変更できます。リストにさまざまなlistyタイプの処理を実行させたい場合は、コンテナーでこれを実行し、単純なデータ構造としてプレーンリストを使用できます。リストの47の異なる使用法があると想像してください。本当に47の異なるサブクラスを維持したいですか?代わりに、コンテナとインターフェイスを介してこれを行うことができます。実装を非表示にしたまま、インターフェースを介してユーザーが新しいメソッドや改善されたメソッドを呼び出しられるようにするための1つのクラス。

于 2010-10-15T20:50:16.903 に答える