私は、ローカルスコープでクラスのメソッドをデコレーション後の関数として公開したいと考えています。たとえば、私は、クラスとデコレータていた場合:Pythonでメソッドの関数バージョンを自動的に公開してデコレートする方法は?
def some_decorator(f):
...transform f...
return decorated_f
class C(object):
def __init__(self,x):
self.x = x
def f(self,y):
"Some doc string"
return self.x + y
def g(self,y,z):
"Some other doc string"
return self.x + y + z
を、私は、プロセスをautomizing気にしなかった場合、私は私のモジュールに次の次のコードを追加することができます。効果に
@some_decorator
def f(C_instance,x):
"Some doc string."
return C_instance.f(x)
@some_decorator
def g(C_instance,x,y):
"Some other doc string."
return C_instance.g(x,y)
を次のことが真であると評価すること
c = C(0)
f(c,1) == c.f(1)
私はこれを自動的に実行したいと考えています。次のようなものがあります。
my_funs = expose_methods(MyClass)
for funname, fun in my_funs.iteritems():
locals()[funname] = some_decorator(fun)
foo = MyClass(data)
some_functionality(foo,*args) == foo.some_functionality(*args)
(この方法ではローカル変数を宣言するのが少し間違っているとは思いますが)トリックを行います。メソッドの関連するすべての属性が関数バージョンに正しく変換されるように、これをどのようにして行うことができますか?私は何か提案を感謝します。
P.S.
私はクラスインスタンスのメソッドをデコレートできることを知っていますが、これは実際に私が後にしていることではありません。これは、(1)ファンクションのバージョン構文の優先順位(2)私のデコレータが、ファンクションを最適化された方法でオブジェクトのコレクションにマップするということです。メソッドをデコレートすることによってビヘイビア(2)を取得するには、コレクションクラスがコレクションセマンティクスに直交するオブジェクトから属性を継承する必要があります。
'locals()'によって返された辞書を変更することは未定義です。私はなぜここで 'globals()'の代わりに 'locals()'を使用しているのだろうかと思います。私が理解する限り、関数はモジュールのグローバルスコープに移動することになっています。 –