ホームページ  >  記事  >  バックエンド開発  >  Pythonでの関数まとめのデコレータクロージャーの詳しい解説

Pythonでの関数まとめのデコレータクロージャーの詳しい解説

WBOY
WBOYオリジナル
2016-06-16 08:47:541053ブラウズ

1. はじめに

関数はオブジェクトでもあるため、属性を表すピリオドを使用して属性を追加できます。

内部関数の定義に外部関数で定義されたオブジェクトへの参照が含まれている場合 (外部オブジェクトは外部関数の外側にある可能性があります)、内部関数はクロージャと呼ばれます。

2. デコレータ

デコレータは元の関数をラップして、元のコードを変更せずにさらに多くのことを実行できるようにします。

デコレータの構文は次のとおりです:

@deco2
@deco1
def func(arg1,arg2...):
  pass

これは 2 つのデコレータを持つ関数を表すため、意味は次のようになります: func = deco2(deco1(func))

パラメータのないデコレータの構文は次のとおりです:

@deco
def func():
  pass

は func = deco(func)

を意味します

パラメータ化されたデコレータの構文は次のとおりです:

@deco(deco_args)
def func():
  pass

の意味: func = deco(deco_args)(func)

複数のデコレータにはパラメータを持つものとパラメータを持たないものがあります。構文は次のとおりです。

@deco2(arg1,arg2)
@deco1
def func():
  pass

は foo = deco2(arg1,arg2)deco1(func)

を意味します

デコレーターは実際には関数であり、関数オブジェクトも受け入れます。

関数を実行する前に、準備コードを実行することも、コードの実行後にクリーンアップ作業を行うこともできます。

デコレーターを見ると、内部に関数を定義し、ターゲット関数への呼び出し、または定義内のどこかに少なくとも参照を埋め込むコードが見つかる可能性があります。

3. デコレータ関数

デコレータの機能は次のとおりです:

ログの導入、パフォーマンスを検出するためのタイミング ロジックの追加、関数へのトランザクション機能の追加

次の例は、パフォーマンスを検出するためのタイミング ロジックの導入を示しています。

#!/usr/bin/env python

from time import ctime,sleep

def tsfunc(func): #装饰器函数接受的是一个函数对象
  def wrappedFunc():
    print '[%s] %s() called' % (ctime(),func.__name__)
    return func() #在这里调用了函数对象,也就是表示装饰器是装饰了原来的函数,从而在原来函数的基础上进行了一些操作
  return wrappedFunc

@tsfunc #装饰器
def foo():
  pass

foo()
sleep(4)

for i in range(2):
  sleep(1)
  foo()

実行結果は次のとおりです。

[root@python 420]# python deco.py 
[Tue Apr 19 16:15:01 2016] foo() called
[Tue Apr 19 16:15:06 2016] foo() called
[Tue Apr 19 16:15:07 2016] foo() called

デコレーター関数では、タイムスタンプが追加され、ターゲット関数が呼び出されます。デコレーターの戻り値はラップされた関数です。

4. 終了

内部関数内で、外部で動作する変数への参照が行われた場合 (ただし、グローバル スコープ内ではない)、内部関数はクロージャとみなされ、外部関数内で定義されていますが、内部関数によって参照または使用されます。この変数は自由変数と呼ばれます。

クロージャの主な機能は次のとおりです:

計算をインストールします。状態を非表示にします。関数オブジェクトとスコープを自由に切り替えます。

コールバックは関数であり、クロージャも関数ですが、少し追加のスコープを持つことができます。

#!/usr/bin/env python

def counter(start_at=0):
  count = [start_at]
  def incr():
    count[0] += 1
    return count[0]
  return incr

count= counter(5)
print count()
print count()

上記の例でわかるように、関数内の関数incrは外部変数countを参照し、毎回1ずつインクリメントするため、変数countを自由変数と呼びます。

上記の Python の関数概要におけるデコレータ クロージャの詳細な説明は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、Script Home をサポートしていただければ幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。