--- tags: python(基本) --- # pythonでよく見る'@'(デコレータ)について Flaskとかモデルを見ていると関数の前に'@app~'みたいに書いてあるのを 見ると思います。なんとなく理解はしていたけれど、デコレータというものらしくpythonの仕組みらしく、メモします。 # デコレータとは デコレータの機能は、関数の修飾することです。 ```python= def deco_hello(func): def wrapper(*args, **kwargs): print("*------------------*") func(*args, **kwargs) print("*------------------*") return wrapper @deco_hello def hello(): print("hello world!") hello() ``` 出力は、 ```bash *------------------* hello world! *------------------* ``` 何となくclassのオーバーライドの関数バージョンのような感じがします。 ### usecase 1. hello()から考える hello()書いた時に、hello()をそのままにして、機能を追加するためにdec_hello()を書く感じですかね。もしくは、Flaskのようにdec_helloは元々定義されていて、それをhelloに追加したという感じです。 2. dec_hello()から考える いろいろ関数を書くときに出力をするときにちょっと手を加えたいな、いちいち書くの面倒だなというときにdec_hello()を宣言しておいて、hello()を書いたので、dec_hello()を追加しようという感じです。 3. 擬似的なマルチスレッド処理? hello()に対して、違う処理も同時に実行したいときにdec_hello()を書くことで、非同期的な処理ができると考えることもできます。 # 調べることになった元凶 ```python= from abc import ABC, abstractmethod class ClassA(ABC): """ClassA defines an interface based on Unit of Work pattern.""" repository: Repository @abstractmethod def begin(self): raise NotImplementedError @abstractmethod def commit(self): raise NotImplementedError @abstractmethod def rollback(self): raise NotImplementedError ``` この'@abstractmethod'が何かよくわからないので、調べることにしました。 とりあえず、pythonには標準でabcクラスというものがあるそうです。 ( [https://docs.python.org/ja/3/library/abc.html](https://docs.python.org/ja/3/library/abc.html) ) このABCクラスというものは、「抽象基底クラス」というものらしいです。リファレンスから、 > (抽象基底クラス) 抽象基底クラスは duck-typing を補完するもので、 hasattr() などの別のテクニックでは不恰好であったり微妙に誤る (例えば magic methods の場合) 場合にインターフェースを定義する方法を提供します。 よくわかりませんね。調べた感じだと、 - 専ら他のクラスに継承されることによって使用される - インスタンスを持たない オーバーライドされるインスタンスを持たないクラスなので、meta的な立ち位置のクラスです。 クラスのinstance typeを規定するために利用させることが用途として考えられます。 ### @abstractmethod > このデコレータを使うには、クラスのメタクラスが ABCMeta かそれを継承したものである必要があります。 ABCMeta の派生クラスをメタクラスに持つクラスは、<span style="color: red;">全ての抽象メソッドとプロパティをオーバーライドしない限りインスタンス化することができません。</span>span>抽象メソッドは通常の 'super' 呼び出し方法で呼ぶことができます。 今回のClassAは他のクラスから呼び出されるもので、その中で「規定」する機能のクラスということになります。 ------------------ # 参考 - [python デコレータについて(Qiita)](https://qiita.com/mtb_beta/items/d257519b018b8cd0cc2e) - [[Python]デコレータを理解する](https://fuji-pocketbook.net/python-decorator/) - [非同期処理やシングルトンをデコレータで実現する](https://deecode.net/?p=402#%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF) ### (発展) - [Python デコレータ再入門](https://qiita.com/macinjoke/items/1be6cf0f1f238b5ba01b#%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E9%96%A2%E6%95%B0%E3%81%AE%E7%A8%AE%E9%A1%9E%E5%88%86%E3%81%91) - [PythonのABC - 抽象クラスとダック・タイピング](https://qiita.com/kaneshin/items/269bc5f156d86f8a91c4)