学習のために、私はクラスによって定義されたデコレータをチェーンしようとしています。私はthis question about decoratorsを読んでいます。これには、関数を使って連鎖することに関する多くの良い情報があります。また、documentationにリンクしていますが、もっと簡単な例を見つけようとしています。クラスとして定義されているチェーン化デコレータ?
基本的に、私はクラスを使用して同様の動作を模倣しようとしています。ここで私の最初のデコレータ定義は完璧に動作します。
class square_result(object):
def __init__(self, f):
pass
def __call__(self, x, y):
return (x+y)**2
@square_result
def add_two_numbers(x, y):
return x + y
print(add_two_numbers(2,5)) #Outputs 49, as expected
その後、私はこのコードスニペットを作成するための別のデコレータを追加します。
class square_result(object):
def __init__(self, f):
pass
def __call__(self, x, y):
return (x+y)**2
class append_abc(object):
def __init__(self, f):
pass
def __call__(self, *args):
return str(*args) + "abc"
@append_abc
@square_result
def add_two_numbers(x, y):
return x + y
print(add_two_numbers(2,5))
#Ideally, this should print "49abc" but prints "(2,5)abc" instead
これを行うための適切な方法は何ですか?私がしたいことは、装飾する関数(この場合はsquare_result
)の出力を受け取り、それにを追加するクラスの形でデコレータを作成することだと思います。
私は私のコードにデコレータを追加するとき、add_two_numbers()
関数がコンパイルされ、その関数オブジェクトは、元add_two_numbers()
に代入される関数のようなオブジェクトを作成するために何かをしsquare_result
クラスに渡されることを知っています。しかし、私はどのようにこれをチェーンするか分からない。
あなたが投稿したバージョンはエラーです。 'str(* args)'から '*'を取り出し、あなたが言ったことをします。 – agf
その行を '' return str(args)+ "abc" ''に変更しますか?それはうまくいかず、私にとっても同じ結果が得られます。 –