2011-01-19 10 views
2

サードパーティのモジュールのクラスXからいくつかの機能が必要です。私はm.Xを直接使用することができますが、m.Xを将来別のクラスn.Yに置き換える必要があるかもしれません(例えば、より良い実装が見つかった場合など)。python:サードパーティのクラスにラッパーを書く

このような状況では、残りのコードを変更しないでください。

今のところ、m.Xの完全なインターフェイス(初期化を含む)を変更しないで渡したいと思います。 、将来的には

class W(m.X): 
    def __init__(self, *args): 
     super().__init__(*args) 

必要が生じれば、私は上記のように書き換えることを計画:次のように私はm.XのラッパーWを書いた

class W(n.Y): 
    def __init__(self, *args): 
     super().__init__(*args) 
    # override instance methods of n.Y that don't share the semantics with m.X 
    # for example, in case f1 is hard to replicate in n.Y: 
    # def f1(self, *args): 
    #  print("this method is no longer available") 
    #  raise MyDeprecatedMethod() 
    # for example, in case f2 needs to be recalculated 
    # def f2(self, *args): 
      # do the calculations required to keep W.f2 unchanged 

が許容m.Xのための私の現在のラッパーですか?それに問題があるか、またはn.Yの計画ラッパーに問題がありますか?

+0

私によく見えます(少なくとも、これは私がやる方法です) –

+0

どのくらいの包装が本当に必要ですか?唯一の問題が残りのコードをネーミングの潜在的な変更から保護しているならば、単純に 'W = m.X'で十分でしょうか? –

答えて

2

最も簡単な方法は記述することです: - タイプを含む

W = m.X 

Pythonで事実上すべてがファーストクラスのオブジェクトです。このクラスは、例えば、他の変数とほとんど見分けがつかない:Wはそれの実際の名前であること出現しつつ

def W(*args, **kwargs): 
    return m.X(*args, **kwargs) 

はm.Xのインスタンスをインスタンス化することができます。 (この方法isinstanceで正常に動作しないことに注意してください - 。それを作業罰金は、最初の例となります)

いくつかのケースでは、割り当てを使用してのIDEとうまく再生されないことがあります。 W=m.X; W(args)を使用するm.Xのインスタンスを作成します。この場合:Wサブクラスであるため、追加のオーバーヘッドでWのインスタンスはm.Xのインスタンスのみであることにも

class W(m.X): pass 

はまた、同じ結果を生成します。

+1

そして、OPが変更された関数をオーバーライドしたい場合は、 'def myFun(self、* args):doSomething()'と 'W.f1 = myFun;を実行できます。 W.f2 = myFun'等 – erbridge

+2

@Fantasizerそれはうまくいくでしょうが、 'm.X'にも当てはまります。関数をオーバーライドするのは、新しいクラスを作成し、必要なメソッドだけをオーバーライドすることです(変更しない限り '__init__'を実行する必要はありません)。 – Zooba

3

あなたは、単にデフォルトでm.X.__init__()を継承

class W(m.X): 
    pass 

を使用することができます。

0

潜在的に変更を最小限に抑えるので、あなたのコードが自動的に新しいモジュールを反映している。これは、MXとnyが使用している彼らの方法でどのように異なるに依存するであろうが、それは

try: 
    import n.Y as foo 
except ImportError: 
    import m.X as foo 

class W(foo): 
    pass 

ような単純なものでしたあなたのコードベース全体で行う必要があります。

関連する問題