2017-06-06 5 views
0

この質問はanother questionに関連しています。Pythonデコレータに引数の不明なリストを送る方法 - デコレータが別のクラスのメソッドである場合?

以下に示すように、私はPythonデコレータを作成しました。私は、このデコレータが不明な引数のリストを受け入れるようにしたい。しかし、しわがあります。デコレータは、別のクラスのインスタンスメソッドである:

#!/usr/bin/env python 
from functools import wraps 


class A: 

    def my_decorator(self, func=None, **kwargs): 

     def inner_function(decorated_function): 

      def wrapped_func(*fargs, **fkwargs): 
       print kwargs 
       return decorated_function(*fargs, **fkwargs) 
      return wrapped_func 

     if func: 
      return inner_function(func) 
     else: 
      return inner_function 

class B: 
    my_a = A() 

    @my_a.my_decorator(arg_1="Yolo", arg2="Bolo") 
    def my_func(): 
     print "Woo Hoo!" 


my_B = B() 
B.my_func() 

しかし、以下、このコードは動作しません:

Traceback (most recent call last): 
    File "./decorator_test.py", line 30, in <module> 
    B.my_func() 
TypeError: unbound method wrapped_func() must be called with B instance as first argument (got nothing instead) 

それを修正する方法は?

class A: 
    def __init__(self, func=None, **kargs): 
     self.args = func 
     self.kargs = kargs 
    def __call__(self, decorated_function): 
     def wrapper_func(*args, **kargs): 
      print kargs 
      return decorated_function(*args, **kwargs) 
     if self.func: 
      #..do something.. 
      return wrapper_func 
     elif 'xyz' in self.kargs: 
      #...do something else here.. 
      return wrapper_func 
     else: 
      ... 


class B: 
    @A(arg_1="Yolo", arg2="Bolo")    # A(...)(my_func) 
    def my_func(): 
     print "Woo Hoo!" 

これはデコレータを符号化する一般的な方法である:

+0

ここで '@ staticmethod'を忘れましたか? 'my_func()'は 'B'のメソッドであり、オブジェクトを呼び出す必要があるためです。 'self'パラメータもありません。または、それは 'my_B.my_func()'でなければなりません(その場合、 'self'はまだ失われています)。 – dhke

+0

私は 'my_B.my_func()'を意味しました。ごめんなさい。私はタイプミスを修正し、現在は動作しています。 –

答えて

0

はここにあなたのデコレータをコーディングする私のアプローチです。クラスAは、呼び出し時に呼び出し可能なオブジェクトを返します。クラスAの呼び出し可能オブジェクトは、装飾のために自動的に呼び出されます。呼び出し可能オブジェクトが呼び出されると、その__call__メソッドがトリガーされ、その__call__演算子オーバーロードメソッドは、何らかのカスタマイズを実行した後にラッパー関数を返します。ラッパー関数は、元の関数の周りにロジックをラップする関数です。

関連する問題