2012-11-19 30 views
-1

可能重复:
Understanding Python decorators什么是装饰者用于?

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

+0

到目前为止发现了什么? – Tadeck

+0

@Bakuriu我不认为这是重复的这个问题是关于“为什么”。你提到的那个是关于“如何”。 – luc

+0

@Tadeck我发现它可以在执行装饰函数之前和之后添加额外的代码。还有其他用法? – hbprotoss

回答

3

的装饰语法是强大的:

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

相当于

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

这意味着,装饰可以做基本上什么 - 他们不具有任何与装饰功能的关系!实例包括:

  • memoising一个递归函数(functools.lru_cache
  • 记录所有呼叫的功能
  • 执行所述描述符的功能(property
  • 标记的方法为静态(staticmethod
+0

在附注上,装饰器可以返回* any *对象,所以当你调用一个装饰函数时,你不能假定“真实”函数被调用(尽管这是99.9999%的情况发生的) 。 – Bakuriu

0

一个很好的实际例子是来自Python自己的unittest framework,它使用装饰器来跳过测试,并使用ex (

跳过测试只是使用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 
0

的装饰环绕的方法,甚至是整个班级,并提供操纵例如一个方法调用的能力。我经常使用@Singleton装饰器来创建一个单例。

装饰者是非常强大和非常酷的概念。

看看这本书了解它们:http://amzn.com/B006ZHJSIM