什么是装饰者用于?

可能重复:
了解Python装饰器

许多文档在线关注装饰器的语法。 但我想知道装饰者在哪里以及如何使用? 修饰器是否仅用于在装饰函数之前和之后执行额外的代码? 或者也许还有其他用法?


装饰器语法很强大:

@decorator
def foo(...):
    ...

相当于

def foo(...):
    ...
foo = decorator(foo)

这意味着装饰器基本上可以做任何事情 - 它们不必与装饰函数有任何关系! 例子包括:

  • 记忆一个递归函数( functools.lru_cache
  • 记录所有呼叫到一个功能
  • 实现描述符功能( property
  • 将方法标记为静态( staticmethod方法)

  • 一个很好的实例是来自Python自己的unittest框架,它使用装饰器来跳过测试和预期的失败:

    跳过测试只是使用skip()装饰器或其一个条件变体的问题。

    基本跳过看起来像这样:

    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

    链接地址: http://www.djcxy.com/p/23809.html

    上一篇: What is a decorator used for?

    下一篇: Explain how Python decorator works