关于python:装饰器decorator 是用来做什么的?

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