へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)! #vZkt8fc6J

Pythonのデコレータがわけわからなかったのでググって解決した。

ここのサイトが他のところより少し分かりやすかった。

Pythonのデコレータとは何者か? - まどろみの思考空間

引用する。

 

def hoge(func):
	print "hoge"

@hoge
def bar():
	print "bar"

これと

def hoge(func):
	print "hoge"

def bar():
	print "bar"
bar = hoge(bar)

これが等価!

っていう説明のせいでデコレータがわかりづらいんだっていう説明から始まっている。

わかりにくいのはすごく同意した。

でもそのまま読み進めると、個人的にその説明がまたわかりづらかったという><;

よくわからなくなったので他のサイトを探し出す。

 

超明快なサイトがここ。

Life is beautiful: Python入門:デコレータとは

 

 デコレータって言うのは

その名のとおり、デコレーションをするために開発されたモノらしい。←混乱させてしまう文かもしれないので読み飛ばしていいです。

わかりやすかった説明を引用する。

ひと言で言えば、それまでのPythonでクラスメソッドを定義するには、

 

def foo(self):

    メソッドの本体

    ...

foo = classmethod(foo) #ここで実はクラスメソッドだと宣言

 

としなければならなかったのだが、これでいかにも後付けで言語として格好が悪い(手紙の冒頭に「あなたは美しい、あなたが好きだ、あなた無しでは生きて行けない」とさんざん書いておいて、最後に「これはあなた向けに書いたものではなく、単なる『詩』です」と追記するようなもの)、ということで導入されたのが以下のデコレータである(最初に『詩』だと宣言しておけば、ラブレターと誤解されることもない)。

 

@classmethod

def foo(cls):

    メソッドの本体

    ... 

 前者の定義方法では、

「fooはこういう関数だよ。」

「fooは実はクラスメソッドだったんだよ。出力するね」 #な、なんだってーーー!!!

となってしまう。

後者の定義方法では、

「次に書くコードはクラスメソッドだよ。あとで出力するね」

「それはfooっていう関数だよ。」

となる。

簡単な例が書いてあったので、それを解説してみる。(簡単とか書いてあったのに理解するのに10分くらいかかったのは秘密だ。)

簡単な例として、「俳句を返す関数」を「短歌を返す関数」に変更してしまう haiku_to_tanka デコレータを実装してみよう。例えば、

 

def furuike():

    return u"古池や蛙飛びこむ水の音"

 

 という俳句を返す関数があった場合、それが短歌を返すようにデコレーションするには、

def haiku_to_tanka(original_func): #俳句から短歌にする関数だよ

    def decorated_func(*args): #デコレートする関数だよ

        return original_func(*args) + u" それにつけても金の欲しさよ" #これをデコレートする関数なんだよ

    return decorated_func #この関数が俳句から短歌にする関数なんだよ

というデコレータを前もって定義しておき、

 

 

 

@haiku_to_tanka

def furuike():

    return u"古池や蛙飛びこむ水の音"

 

 

としてあげるだけでよい。先のclassmethodデコレータを同じく、これは実質的には

 

 

 

 

def furuike():

    return u"古池や蛙飛びこむ水の音"
furuike = haiku_to_tanka(furuike)

 

 

と等価である。 

 

プログラミングにありがちなこととして

 

やってるうちに不便なことが見えてくる。

→便利にしてみた。

→結果、初心者には意味不明なモノに見えるようになる。

 

みたいなことが多いと思う。

『なんでそれ使うようになったのか』の経緯とかも一緒に載せないと、すごくよくわからないと思う。

 

なんのために車あるのかわからないのに車の運転習ってても、あんまりうまくならないじゃん。

そりゃずーっと車運転習ってたら、『あぁなんだ、道を走るために車ってあるのか』ってわかるようになるけど。

なんか前もこんなようなこと言った気がするな(・ω・)