What is a decorator used for?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Understanding Python decorators
许多在线文档都关注decorator的语法。但我想知道装饰师在哪里以及如何使用?装饰器只是用来在装饰函数前后执行额外的代码吗?或者可能还有其他用法?
decorator语法非常强大:
1 2 3 | @decorator def foo(...): ... |
等于
1 2 3 | def foo(...): ... foo = decorator(foo) |
这意味着装饰师基本上可以做任何事情——他们不必与装饰功能有任何关系!示例包括:
- 记忆递归函数(
functools.lru_cache ) - 记录对函数的所有调用
- 实现描述符功能(
property ) - 将方法标记为静态(
staticmethod )
decorator包装了一个方法,甚至是一个完整的类,并提供了操作的能力,例如方法的调用。我经常使用@singleton修饰符来创建singleton。
装饰师是非常强大和非常酷的概念。
请看这本书了解它们:http://amzn.com/b006zhjsim
一个很好的实践示例来自于Python自己的UnitTest框架,它利用装饰器跳过测试和预期的失败:
Skipping a test is simply a matter of using the skip() decorator or
one of its conditional variants.Basic skipping looks like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |