Pythonのデコレーターでメタプログラミング 【第2回】【動的に装飾】 #6
どうも hkrblog です.
最近仕事が忙しく更新できませんでした....w(言い訳苦しい...)
今日は前回の続きの記事です.
まだメタプログラミングという感じはしないです.
デコレーターが関数の修飾(上書き)をすることができるなら、
デコレーター対象の関数の中身がない場合は関数自体を生やすことになるのではないか?
という発想ですね.
こう書くとちょっと馬鹿っぽいですねw
技術内容としては普通に デコレーターに引数を渡す というものです.
@デコレーターの関数
のシンタックスシュガーに引数を渡します.
コードを見ましょう...!!!
def argument_sayer(what): def _say(method): def _action(self, *args, **kws): print(what) return method(self, *args, **kws) return _action return _say def create_pc(maker_name): class PC: @argument_sayer(maker_name) def display(self): pass return PC() def main(): pc1 = create_pc('DELL') pc2 = create_pc('ASUS') pc1.display() print('-------------') pc2.display() if __name__ == '__main__': main() """ DELL ------------- ASUS """
あ〜〜〜〜、、、これはメソッド生やしちゃってますねw
まず、メインなんですがcreate_pc('DELL')
でPC作ってますね.
create_pc()はというと、シンプルに引数にメーカー名をとり、PCのインスタンスを作成する関数ですね.
pc1.display()
で何かは分からないですが、PCインスタンスのdisplayメソッドを呼び出しましたね.
じゃあ、displayメソッドは何かというと、中身はないです....
しかし、デコレーターが付いてます.
このデコレーターは引数にメーカー名を取って、修飾します.
argument_sayer(what)
こいつなんですが、何してるかというと、デコレーターの関数を作成してます.
なので_say()
がデコレーターになります. で実際の処理の部分が_action
ですね.
print(what)
でメーカー名を出力する動きです.
PCクラスのdisplayメソッドは何もしないメソッドでしたが、無事デコレーターで処理を作成することができました.
パッっと見るとわからん...となるのですが、書いてみるとこんなものか.....という感じですね.
次回は最終回です!
また次回でお会いしましょう~~~