@デコレータは機能付加ではなく、書き換えであった

引数をプリントする関数

def funcA(x):
     print(x)

#実行
funcA(25)
25

何もしないデコレーター関数を定義

def overwrite(func): # 関数のアドレスを受け取る
    def wrapper(x): # 変更内容、今回は「何もしない」
        pass  
    return wrapper # 関数の実行部分のアドレスを返す

先の関数 funcA を overwrite でデコレートする

@overwrite 
def funcA(y):
     print(y)
#実行
funcA(30)
何も起きない(overwrite関数のpassが実行された)

@ デコレーター は、機能を付加するという解説だが、funcAが実行されないということは、もとの関数を置き換えてしまうらしい。

元の関数を実行するには、デコレーター関数内で、明示的に実行させないといけない、のか?


@デコレーターを初めから書く

def overwrite(func):
    def wrapper(x): # 書き換え関数の宣言
        func(x) # 呼び出し元の関数を「実行」させる
    return wrapper # 上書き関数のアドレスを返す


@overwrite #デコレーター宣言(呼び出し) 
def funcA(y):
     print(y)



funcA(30)
結果、funcAは実行されず、overwiteが呼び出され→呼ばれてないのにwrapperが実行される→(その中でfuncAが実行)
30

つまり、自分を呼び出す関数を作って、それで自分を上書きして、その関数を呼び出す?のか?

overwriteの中のwrapperは自動で呼ばれるのはそれで良いんだっけ?

関数の中で定義された関数は自動で呼ばれるんだっけか?

関数をもう一度確認しなければ! 何も理解していない、覚えていない(泣)

コメント

タイトルとURLをコピーしました