2017-01-10 21 views
0

これはpythonでこれが可能ですか?Python:基本クラスのヘルパー関数呼び出しをオーバーライド

モジュールA:

def _helper: 
    print('helper_a') 

class A(): 
    def foo(self): 
     _helper() 

モジュールB:

def _helper: 
    print('helper_b') 

class B(A): 
    """ Somehow make B.foo call module B _helper without overriding A.foo""" 
+0

あなたは、あなたが 'B()を呼び出したときに起こることを期待していFOO()':nはBの代替バージョンを提供? –

答えて

1

_helperは、あなたが何か他のものにそれを設定することができ、その後、A().foo()への呼び出しがあることを使用するモジュールAでちょうど世界的です新しいグローバル。これは、サルパッチと呼ばれています。

あなたがclass Bのみを使用_helperにパッチを適用したい場合は、その後、あなたは毎回パッチを適用し、未パッチする必要があると思います。これが行われますが、スレッドセーフではなく、一般的にあなたが開始するモジュールAをリファクタリングすることができない場合にのみ使用してくださいすることができます。

class B(A): 
    def foo(self): 
     orig_helper = moduleA._helper 
     moduleA._helper = _helper 
     try: 
      return super().foo() 
     finally: 
      moduleA._helper = orig_helper 

あなたにもちょうどクラスBfooをオーバーライドすることがあります。

def _helper: 
    print('helper_b') 

class B(A): 
    """ Somehow make B.foo call module B _helper without overriding A.foo""" 
    def foo(self): 
     _helper() 

あなたは、モジュールAをリファクタリングすることができた場合、あなたはクラスで_helper機能に静的関数を作ることができる:あなたがCAポイント

class A(): 
    @staticmethod 
    def _helper(): 
     print('helper_a') 

    def foo(self): 
     self._helper() 

れます。

class B(): 
    @staticmethod 
    def _helper(): 
     print('helper_b') 

など

+0

ありがとうMartijn、それは私が探していた非常に有用な情報です。 – Lucky711

関連する問題