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#でのデコレータ実装
この実装方法でいいのかどうかは知らない。
実際はラムダ式でもっと簡単に書ける
条件式が1行しかない簡単なものなら、無名関数を使ってもっと簡単に書ける。今回はデコレータの説明のためにムリヤリ例を作ったので、無駄に冗長なコードに見えてしまう。今回のようなことをしたいなら、実際はこうやって書くか、もっと簡単な方法もあるかもしれない。
では、デコレータはどういうときに使うのか?実装の仕方がわかっただけで、使いどころがわからない。これでは結局、デコレータを使えない。
所感
デザインパターンは頭に入らない。使いどころがわからない。デコレータを使うのがベストだと断言できる実例が思い浮かばない。それが思い浮かぶ人は、パターンなんて考えず自然にデコレータを使っているのだろう。