2017-07-13 14 views
1

は、私は次のように、インスタンスメソッドのためにデコレータを記述しようとしています:クラスメソッドと静的メソッドのpythonデコレータ?

from functools import wraps 

def plus_decorator(f): 
    @wraps(f) 
    def wrapper(*args, **kwargs): 
     return 1 + f(*args, **kwargs) 
    return wrapper 

@plus_decorator 
def return_i(i): 
    return i 

class A(object): 
    @plus_decorator 
    def return_i(self, i): 
     return i 

    @plus_decorator 
    @classmethod 
    def return_i_class(cls, i): 
     return i 

    @plus_decorator 
    @staticmethod 
    def return_i_static(i): 
     return i 

if __name__ == '__main__': 
    print return_i(1) 
    a = A() 
    print a.return_i(1) 
    print A.return_i_class(1) 
    print A.return_i_static(1) 

しかし、それがエラーをポップアップ:

AttributeError: 'classmethod' object has no attribute '__module__' 

デコレータはclassmethod上では動作しませんなぜ私が疑問に思っておよびstaticmethod。私は、デコレータがほとんどすべてのパラメータをラッパーに渡し、結果を変更するだけだと思います。デコレータを変更してclassmethodstaticmethodで動作させるにはどうしたらいいですか?

+0

あなたのコールサイトはどのように見えますか? – Will

+0

これは正常に動作します。あなたはそれを呼び出すために 'A()'のインスタンスを作成していません。 'a = A(); a.return_i(1) '。おそらく '@ classmethod'も必要でしょうか? – AChampion

+0

私が会った元のエラーは、クラスメソッドのデコレータで、何とか私はインスタンスメソッドのcallsiteを使いこなしました。私は内容を変更させてください。 –

答えて

0

ちょうど順序を反転します。 @classmethodまたは@staticmethodを外側に置き、内部にはデコレーター(@wrapsを使用しているため、裸の機能が必要です)を入れます。

@classmethod 
@plus_decorator 
def return_i_class(cls, i): 
    return i 
0

逆転してください。 @staticmethodと@classmethodは、最上位のデコレーターているとき、あなたのデコレータ機能を期待したが、両方の他のデコレーターが記述子オブジェクトを返すのでhere

を説明するように

は、それが動作します。

関連する問題