ホームページ  >  記事  >  バックエンド開発  >  Python デコレータの使用例

Python デコレータの使用例

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

Python デコレータとは何ですか?

インターネット上の定義:
デコレータは、関数をラップし、元の関数を変更し、それを元の識別子に再割り当てし、元の関数への参照を永久に失う関数です。

デコレータの最良の例は次のとおりです:

コードをコピー コードは次のとおりです:

#-*- コーディング: UTF-8 -*-
import time

def foo():
print 'in foo()'

# タイマーを定義し、タイマーを渡し、タイミング関数がアタッチされた別のメソッドを返します
def timeit(func):

#埋め込みラッパー関数を定義し、渡された関数にタイミング関数ラッパーを追加します
def Wrapper():
start = time. Clock()
func( )
end =time. Clock()
print 'used:', end - start

# ラップされた関数を返す
return Wrapper

foo = timeit(foo) )
foo()

Python は、上記のコードを簡略化するために @ シンボルの構文シュガーを提供します。これらは同じ機能を持っています

コードをコピー コードは次のとおりです:

import time

def timeit(func):
def Wrapper():
start = time. Clock()
func()
end =time. Clock()
print 'used:', end - start
return ラッパー

@timeit
def foo():
print 'in foo()'

foo()

これら 2 つのセクションのコードは同じで同等です。

3 つの組み込みデコレータは、staticmethod、classmethod、property です。これらの機能は、次のように、クラスで定義されたメソッドをそれぞれ静的メソッド、クラス メソッド、プロパティに変換することです。

コードをコピー コードは次のとおりです:
class Rabbit(object):

def __init__( self, name ):
self._name = name

@staticmethod
def newRabbit(name):
return Rabbit(name)

@classmethod
def newRabbit2(cls ):
return Rabbit('')

@property
def name(self):
return self._name

デコレータのネスト:

ルールは 1 つだけです。ネストの順序はコードの順序と逆です。
例も見てみましょう:

コードをコピー コードは次のとおりです:
#!/usr/bin/python
# -*-コーディング: utf -8 -*-
def makebold(fn):

def Wrap():
return "" + fn() + ""
return Wrap

def makeitalic(fn):

def Wrap():
return "" + fn() + ""
return Wrap

@makebold

@makeitalic
def hello():
return "hello world"

print hello()


返される結果は次のとおりです:

hello world
この結果はなぜですか?
1. まず、hello 関数は makeitalic 関数で修飾され、結果 hello world になります。
2. 次に、makebold 関数で修飾されて になります。 ;i>hello world、これは非常に簡単に理解できます。

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