LoginSignup
1
0

More than 5 years have passed since last update.

【Python3】超初心者のデコレータMEMO

Last updated at Posted at 2019-03-19

はじめに

この記事は超初心者の覚書です。
言語はPython3系。

decoratorの定義


def decorator1(func):
    ~何らかの処理~

があったとして、


@decorator1
def kansuu(~):
    ~何らかの処理~


def kansuu(~):
    ~何らかの処理~

kansuu = decorator1(kansuu)

全く同じ意味です。

練習問題をやってみよう

このままでは物足りないので、簡単に練習問題を書いてみました。

問題

次のコードの実行結果を答えてください。
(直後に答えを書きます)


def decorator1(func):
    def wrapper(text):
        print('1')
        func(text)
        print('2')
        print('text:'+text)
        print('3')

    return wrapper

@decorator1
def myouzi(name):
    print('私の名字は「'+name[0:2]+'」です。')


myouzi('浦島太郎')

答え

1
私の名字は「浦島」です。
2
text:浦島太郎
3

解説

最初に書いたようにデコレータを書き換えてみます

def decorator1(func):
    def wrapper(text):
        print('1')
        func(text)
        print('2')
        print('text:'+text)
        print('3')

    return wrapper

def myouzi(name):
    print('私の名字は「'+name[0:2]+'」です。')


myouzi = decorator1(myouzi)  #ここがミソ


myouzi('浦島太郎')

すると、myouzi('浦島太郎')で呼び出されるのは、

    print('1')
    print('浦島太郎'[0:2])   #元のmyouzi関数の処理
    print('2')
    print('text:'+'浦島太郎')
    print('3')

となります。

myouziにはdecorator1内のwrapper関数func関数myouzi関数に置き換わったものがdecorator1(myouzi)の戻り値として代入されるからです。

(いい加減&文法的に間違ってそうな説明でごめんなさい)

終わりに

当方超初心者のため間違っている説明やわかりにくいところがあると思うのでその際は遠慮なく指摘お願いします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0