スターエンジニアになりたい

異世界転生を待って早10年

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メソッドは何もしないメソッドでしたが、無事デコレーターで処理を作成することができました.
パッっと見るとわからん...となるのですが、書いてみるとこんなものか.....という感じですね.

次回は最終回です!
また次回でお会いしましょう~~~