2016-10-31 5 views
-3

私は関数にデコレータを使用したいと考えています。デコレータ関数はクラス内で定義されており、そのクラスのオブジェクトに固有のものでなければなりません。たとえば、クラスオブジェクトのメソッドを使ってpython関数をデコレートする

class Foo: 
    def __init__(self): 
     self.a = 1 

    def set_a(self, val): 
     self.a = val 

    def bar(func): 
     def _args(*args, **kwargs): 
      func(*args, **kwargs) + self.a 
     return _args 

if __name__ == "__main__": 

    foo = Foo() 
    foo2 = Foo() 

    foo.set_a = 2 

    @foo.bar 
    def multip(a, b): 
     return a * b 

    multip(1, 2) # here i would expect answer to be 4   

    foo.set_a = 3 

    multip(1, 2) # here i would expect answer to be 5 

    @foo2.bar 
    def multip2(a, b): 
     return a * b 

    multip2(1, 2) # here i would expect the answer to be 3 
+0

あなたは「そのクラスのオブジェクトに固有」とはどういう意味ですか?あなたが持っているコードと持っているコードの違いは何ですか? ( 'bar'に' self'引数を忘れてしまったことに注意してください)。 – BrenBarn

答えて

0

あなたが探していることをすることができますが、私はこれを良いデコレータと見なすかどうかはわかりません。どうしてクラスデコレータに行き、__init__()__call__()を使用してみませんか?

とにかくここにあなたの固定コードです:

class Foo: 
    def __init__(self, a=1): 
     self.a = a 

    def bar(self, func): 
#   ^^^^ you need self 
     def _args(*args, **kwargs): 
      return func(*args, **kwargs) + self.a 
#   ^^^^^^ You need to return here. 
    return _args 

foo = Foo() 

@foo.bar 
def multip(a, b): 
    return a * b 

multip(1, 2) 
# 3 
foo.a = 2 
multip(1, 2) 
# 4 
foo.a = 3 
multip(1, 2) 
# 5 
関連する問題