2016-06-20 4 views
0

私はPythonクラスFooとよりメモリを意識したバージョンLightFooを持っています。その属性に含まれる情報は最終的には同じですが、別の方法でエンコードされます。キャストで一括してPythonメソッドを実装する

Fooの方法の一握りを完全にLightFooのために再書き込まれますが、それらのほとんどのためにFooLightFooインスタンスをキャストし、対応するFooメソッドを呼び出す罰金になります。例えば、LightFooは、次のものがありますFooは100個のメソッドを持って

def total(self): 
    self.fooize().total() 

場合は、しかし、これは本当に退屈な取得します。本当に便利なのは、LightFooFooから継承し、デフォルトではLightFooに見つからないすべてのメソッドに何らかの形で挿入することです。私はこれが不可能だと確信していますが、Fooのメソッドごとに上記のようなブロックを書くよりも優れたアプローチが必要なようです。

+2

'LightFoo'が' Foo'を継承している場合、 'LightFoo'で定義していないメソッドは自動的にデフォルトで' Foo'になります。それはあなたが探しているものではありませんか? – dwanderson

答えて

1

fooize()がオブジェクトをFooに変換するカスタム処理を行っている場合は、見つからない属性にアクセスするときに呼び出される__getattr__を定義するだけでこれを行うことができます。あなたはfooize()に電話することができます。

def __getattr__(self, name): 
    return getattr(self.fooize(), name) 

これ以外の場合は、Fooから継承し、存在しないメソッドをスーパークラスに戻すことができます。

関連する問題