2016-12-02 6 views
2

私は引数を持つclassを飾るしようとしているが、それは仕事を得ることはできません。Pythonの装飾クラス

これはデコレータです:

def message(param1, param2): 
    def get_message(func): 
     func.__init__(param1,param2) 

    return get_message 

クラス私はデコレータを入れたい

@message(param1="testing1", param2="testing2") 
class SampleClass(object): 
    def __init__(self): 
    pass 

これは動作しませんが、これを実行するとエラーが発生します。だれかが問題を知っていますか?いくつかの値を持つクラスを初期化するデコレータを作成しようとしています。

+0

ここで、デコレータは「SampleClass」にバインドするオブジェクトを返しますか? –

+0

それは私が助けが必要なものです。私はそれをする方法を知らなかった。 – IoT

+0

'get_message()'から何かを返そうとしましたか? –

答えて

7

あなたがしようとしていることを理解するのに問題があります。引数を取るデコレータでクラスを飾りたい場合は、それを行う方法の1つは次のようなものです。

# function returning a decorator, takes arguments 
def message(param1, param2): 
    # this does the actual heavy lifting of decorating the class 
    # this function takes a class and returns a class 
    def wrapper(wrapped): 

     # we inherit from the class we're wrapping (wrapped) 
     # so that methods defined on this class are still present 
     # in the decorated "output" class 
     class WrappedClass(wrapped): 
      def __init__(self): 
       self.param1 = param1 
       self.param2 = param2 
       # call the parent initializer last in case it does initialization work 
       super(WrappedClass, self).__init__() 

      # the method we want to define 
      def get_message(self): 
       return "message %s %s" % (self.param1, self.param2) 

     return WrappedClass 
    return wrapper 

@message("param1", "param2") 
class Pizza(object): 
    def __init__(self): 
     pass 

pizza_with_message = Pizza() 

# prints "message param1 param2" 
print pizza_with_message.get_message() 
+0

ありがとう、これはまさに私がやりたかったことです! – IoT

関連する問題