重複の可能性:
Pythonデコレータを理解する
オンラインの多くのドキュメントは、デコレータの構文に関するものです。しかし、デコレータがどこでどのように使用されているのか知りたいですか?デコレータは、デコレートされた関数の前後に追加のコードを実行するためだけに使用されますか?または多分他の使用法がありますか?
重複の可能性:
Pythonデコレータを理解する
オンラインの多くのドキュメントは、デコレータの構文に関するものです。しかし、デコレータがどこでどのように使用されているのか知りたいですか?デコレータは、デコレートされた関数の前後に追加のコードを実行するためだけに使用されますか?または多分他の使用法がありますか?
デコレータ構文は強力です。
@decorator
def foo(...):
...
と同等です
def foo(...):
...
foo = decorator(foo)
つまり、デコレータは基本的に何でもできます。デコレートされた機能とは何の関係もありません。例は次のとおりです。
functools.lru_cache
)property
)staticmethod
)実用的な良い例は、デコレータを使用してテストと予想される失敗をスキップするPython 独自のunittest フレームワークからのものです。
テストをスキップするには、skip() デコレーターまたはその条件付きバリアントの 1 つを使用するだけです。
基本的なスキップは次のようになります。
class MyTestCase(unittest.TestCase):
@unittest.skip("demonstrating skipping")
def test_nothing(self):
self.fail("shouldn't happen")
@unittest.skipIf(mylib.__version__ < (1, 3),
"not supported in this library version")
def test_format(self):
# Tests that work for only a certain version of the library.
pass
@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
def test_windows_support(self):
# windows specific testing code
pass
デコレーターは、メソッドまたはクラス全体をラップし、メソッドの呼び出しなどを操作する機能を提供します。@Singleton デコレーターを使用してシングルトンを作成することがよくあります。
デコレータは非常に強力で、本当にクールなコンセプトです。
それらを理解するためにこの本を見てください:http://amzn.com/B006ZHJSIM