2012-03-24 2 views
1

別のメソッドに引数を挿入するメソッド(set)を作成したいとします(set_result)。私はpartialを以下のように使って試しました。クラス定義で別のメソッドをラップする

from functools import partial 

class MyClass(MyClassParent): 
    set = partial(MyClassParent.set_result, None) 

しかし、これは機能しません。私はこれが暗黙のselfが渡されていないことを意味想定し

TypeError: set_result() takes exactly 2 arguments (1 given) 

MyClassのインスタンスにsetを呼び出すとき、私はこのエラーを取得します。私はこのようなsetを記述する場合、それは動作します:

def __init__(self, *args, **kwds): 
    super().__init__(*args, **kwds) 
    self.set = partial(self.set_result, None) 

どのように私は前者の方法を使用してset_resultをラップすることができますか?

+0

2番目のバージョンで何が問題になっていますか?それはこれを行う正しい方法です。 – Marcin

+0

'set_result'の署名は何ですか? – katrielalex

+0

@Marcin:なぜ私はそれをより簡潔にバインドすることができないのか、そして「実行時」のオーバヘッドが少ないのか分かりません。私がpartialを使ってラッパーを行うことができるなら、Cから 'wrapper 'が実行されます。 –

答えて

0

これがうまくいかない理由はfunctools.partialがディスクリプタではないということです。インスタンス上でアクセスすると、バインドされたメソッドは返されません。

私はpatchを提出したこのためのトラッカーにPython bugがあります。

0
set = staticmethod(partial(MyClassParent.set_result, None)) 
+0

私はこれがOPが望んでいるとは分かりません。彼の2番目のバージョンが正しく動作することを考えれば、これにより、None selfを持つset_resultのバージョンが作成されますが、依然として引数を取る必要があります。 – Marcin

0
class MyClass(MyClassParent): 
    set = partial(MyClassParent.set_result, MyClassParent, None) 
関連する問題