Python、はじめました

非プログラマーかつ私文卒リーマンの Pythonデビュー全記録

【SoloLearn】関数プログラミング-Decorators

f:id:pokita:20180527162737p:plain

SoloLearn-Functional Programming-Decorator

 

こんなの【初めてのPython】でも見たことない!!!ってPython3からの登場らしいし当たり前か。本文の英語がネイティブでも意味わからないらしくて、批難のコメントで溢れかえっている本項。2巡目のぼくでもけっっこう分からなかったゾ…。

まずは第1項。

 

Decorators provide a way to modify functions using other functions.

This is ideal when you need to extend the functionality of functions that you don't want to modify.

デコレータは関数が他の関数を使えるように修正する方法を提供します。これは、修正したくない関数、の機能を拡張する必要があるとき理想的です。

 

うーんよくわからない。

実際に回してみる。

 

def decor(func):

  def wrap():

    print("==========")

    func()

    print("==========")

  return wrap #←関数の実行ではなく関数オブジェクト自身なことに注目

 

def print_text():

  print("Hello world!")

 

decorated = decor(print_text)

decorated()

>>>

==========

Hello world!

==========

>>>

 

decorated→decor関数をprint_text関数を引数に呼び出したときの戻り値→

wrap():

  print("==========")

  print_text()

  print("==========")

で定義されるwrap関数自身!!!!

つまり、変数decoratedには上記の関数自身が代入されているため、その関数を実行させるためには、decoratedではなくdecorated()とする必要がある。

のはわかったけど、その後に続く英文が意味不明。

 

We could say  that  the variable decorated is a decorated version of print_text-it's print text plus something.

この修飾された変数を、『修飾版print_text(関数)』と呼ぶことができる。これは、print_text(関数)に他(の機能)を追加したものだ。

In fact, if we wrote a useful decorator we might want to replace print_tex with the decorated version altogether so we always got our "plus something" version of print_text.

This is done by re-assigning the variable that contains our function.

実際、便利な修飾関数を書いたら、print_text関数をその修飾版にそっくり置き換えたくなるこもしれない。そうすれば、常に"何かしら拡張された"版のprint_text関数を得ることができる。

 

printで出力するものについてはすべてAの修飾をつける!というのであれば、一旦Aという修飾関数を作ったあと、出力関数prinntXを作り、printX=A(printX)とすることで、printX(変数)を上書きすることで、見かけ上printX関数の機能を拡張することができる。