许多文档在线关注装饰器的语法。但我想知道装饰器在哪里以及如何使用?装饰器是否仅用于在装饰函数之前和之后执行额外代码?或者可能有其他用途?
答案 0 :(得分:3)
装饰器语法很强大:
@decorator
def foo(...):
...
相当于
def foo(...):
...
foo = decorator(foo)
这意味着装饰者可以基本上做任何事情 - 他们不必与装饰函数有任何关系!例子包括:
functools.lru_cache
)property
)staticmethod
)答案 1 :(得分:0)
一个很好的实际例子来自Python自己的unittest framework,它使用装饰器来跳过测试和预期的失败:
跳过测试只是使用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
答案 2 :(得分:0)
装饰器包装方法甚至整个类,并提供操作例如方法调用的能力。我经常使用@Singleton装饰器来创建一个单例。
装饰者是非常强大且非常酷的概念。
请阅读本书以了解它们:http://amzn.com/B006ZHJSIM