クラス「A」のインスタンスを格納し、「A」のメソッドのラップされたバージョンを継承する辞書クラス「D」を作成するにはどうすればよいですか?
たとえば、a = A() で、a.first() が「a」に対して何かを実行し、何らかのオブジェクトを返す関数であるとします。次に、 d = D({'k0': a0, 'k1': a1}) に {'k0': a0.first(), 'k1': a1.first を返す属性 d.first() を持たせたい()} を呼び出し、first() の呼び出しと同様に、a0 と a1 の基になるデータを変更します。
さらに、dictクラスにまだ存在しないメソッド(およびおそらく属性)のみを公開したい(ストンプなし)そしてこれを動的に実行したい(Aのメソッドのハードコーディングなし、すべてを入力する方法をすでに知っている)メソッドは手作業で)。'_' で始まらないメソッドのみを扱うことを検討してください。
また、戻り値の型 (後処理、ラッピングなど) に応じて、呼び出しからの出力の処理を 'D' に実行してもらいたいと思います。
これはちょっと悪い考えのように思えますが、どのようなアプローチがあるのか を理解したいだけです。これまでの私の読書から、多重継承を使用して独自の__new__
関数を作成したり、メタクラス化で何か他のことをしたりできるようです。しかし、教祖でない限り、一般的にいじってはいけないという伝承がある__new__
ので、これは私を躊躇させます. これを行うためのデコレータのトリックはありますか? inspect モジュールを使用してクラス「A」をトラバースすることもできると思いますが、これはハックのように感じます。
更新:非常に具体的な例として。pandas.DataFrames のディクショナリがあり、iPython で動作するメソッドのタブ補完も含めて、コレクションを単一の DataFrame のように表示して動作させたいとします (そして、pandas.Panel を使用していません)。簡単にするために、読み取り専用の動作 (インデックス作成と選択) のみを考慮してください。 '] は、キー 'k0' に対応する辞書の値を返す必要があります。ハードコーディングとgetattrの組み合わせは、私が望むことを行いますが、より少ないハードコーディングでこれを行う方法を探っています。
これは、含まれるオブジェクトのように動作するイテラブルを動的に生成したい場合によくある設計上の問題だと思います。