やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Pythonでデコレータの実装を試してみた

Pythonにおけるデコレータの実装について試してみた。

背景

前回の影響で、とりあえずオブジェクト指向的な何かを書いてみようという主旨。たまたまググって知ったから、とにかくやってみただけ。

デザインパターン

オブジェクト指向におけるデザインパターンのうち、デコレータ(Decorator)というものがあるらしい。

デコレータ

ある処理に別の処理を装飾(デコレート)する実装方法。

参考

Pythonでのデコレータ実装方法はこちらを参考にした。感謝。

ソースコード

例1

@timestampがポイント。この例では何が嬉しいのかさっぱりわからない。

例2

指定した条件の数列を取得する。

取得する数列 関数
偶数 get_even
奇数 get_odd
3の倍数 get_multiples3
偶数かつ3の倍数 get_multiples3_even
奇数かつ3の倍数 get_multiples3_odd

条件式の部分で、偶数、奇数、3の倍数の条件を定義している部分が重複してしまっている。同じ内容なので共用したい。

例3

条件式をis_evenなどの関数として外部化した。そして、get_even関数などから参照することで共用できるようになった。

C#でのデコレータ実装

ちなみに、PythonでなくC#では以下のようになった。

この実装方法でいいのかどうかは知らない。

実際はラムダ式でもっと簡単に書ける

条件式が1行しかない簡単なものなら、無名関数を使ってもっと簡単に書ける。今回はデコレータの説明のためにムリヤリ例を作ったので、無駄に冗長なコードに見えてしまう。今回のようなことをしたいなら、実際はこうやって書くか、もっと簡単な方法もあるかもしれない。

では、デコレータはどういうときに使うのか?実装の仕方がわかっただけで、使いどころがわからない。これでは結局、デコレータを使えない。

所感

デザインパターンは頭に入らない。使いどころがわからない。デコレータを使うのがベストだと断言できる実例が思い浮かばない。それが思い浮かぶ人は、パターンなんて考えず自然にデコレータを使っているのだろう。