2016-11-19 55 views
3

を呼び出すときの私はこれを持っているとしましょう、追加の文を作成します。パイソン - 継承されたメソッド

class Foo: 
    ... 
    def func(): 
     return 1+2 

class Bar(Foo): 
    ... 
    def another_func(): 
     # additional stuff I want to do when my parent's func() is called 

私はfuncを上書きする必要はありませんが、私はそれを呼び出してたときに、いくつかの追加のステートメントを追加したいです。また、元のFoo.funcを変更したくありません。

それは可能ですか?それ以外の場合は、回避策のアイデアはありますか?

+1

私はあなたが意味を正確にわからないんだけど

class Foo(object): def func(self): print "In parent" class Bar(Foo): def func(self): super(Bar, self).func() print 'In child' # Your additonal stuff 

あなたがBarfuncとして実行されます。 funcを呼び出してから他のことをやりたいのですか、それともfunc自体を変更したいですか?または、追加の引数を渡したいですか?または...? – Daniel

+1

'func'をオーバーライドしたくない理由をもっと具体的に説明できますか?通常、これはまさにあなたがやることです。サブクラスに 'func'を呼び出し、親' func'を呼び出してから他のことを行います。 – DSM

答えて

1

あなたはfunc関数をオーバーライドし、親のfuncからの呼び出しを行う必要がありますその中で。 Pythonはその目的のためにsuper()があります

super(type[, object-or-type])

戻り、デリゲートメソッドは、タイプの親や兄弟クラスへの呼び出しプロキシオブジェクトを。 これは、クラスでオーバーライドされている継承されたメソッドにアクセスする場合に便利です。 検索順序は、getattr()で使用されるものと同じですが、型自体はスキップされます。

例:

b = Bar() 
b.func() 

が印刷されます::

In parent # <-- from Foo.func() 
In child # <-- from Bar.func() 
4

標準的な解決策はそうのような本来の機能をラップFUNCウントをオーバライドするだろう、ということの方法はありません。

class Bar(Foo): 
    ... 
    def func(): 
     # additional stuff I want to do when my parent's func() is called 
     res = super(Bar, self).func() # super().func() on Py3 
     # additional stuff I want to do after my parent's func() is called 
     return res 
+0

その編集のおかげで... – zabeltech

関連する問題