エラーでなくワーニング (4)
『Pythonクックブック』を調べたが、AutoDelegatorというのが見つかった。重要なポイント以外を"..."で略す。
class AutoDelegator(object): ... def __getattr__(self, key): ... return getattr(self.delegatee, key) ... ...
呼び出し時に見つからなかったメソッドをデリゲートされるオブジェクトに委譲して検索するのがポイント。しかし、d[1] = 'a'などは、__setattr__を定義してもうまくいかなかった。結局jijixiさんのようにデリゲートされるオブジェクトのメソッドを全てコピーした方が確実だと思う。
しかし結局、Delegateを継承した自前のMyDictクラスを定義するか、Delegateのインスタンスに特異メソッドの__getitem__を結合させるしかないので、素直にdictを継承したMyDictを作成するのが一番簡単である。ちなみに、ビルトインのdictを継承した自前クラスのインスタンスにnew.instancemethodで特異メソッド__getitem__を追加してもうまくいかなかった。ビルトインクラスの挙動はかなりクセがある。理論よりとりあえず動くが実験すべき。
まとめると、例えば例外処理を変更するなど、一般的にはビルトインクラスのオブジェクトの挙動の一部を変更したければ、ビルトインクラスを継承した自前のクラスを作成するしかないと言える。さらなる研究は必要だが今のところはこれが結論である。
補足:
結局スタート時点の問題を再考すると、エラー処理のコードを例外クラスにまとめたかったのだが、自前のMyDictクラスにまとまるので例外をフックできなくても全く問題ないと思う。