许多文件关于装饰的语法在线关注。但我想知道装饰者在哪里以及如何使用?修饰器是否仅用于在装饰函数之前和之后执行额外的代码?或者也许还有其他用法?
-1
A
回答
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
相关问题
- 1. 角装饰者中的'this'是什么?
- 2. 什么是“装饰者”,它们是如何使用的?
- 3. WPF装饰者有什么意义?
- 4. WPF装饰者与定制装饰者?
- 5. 什么是伪装饰者设计模式?
- 6. 装饰者的运行顺序是什么?
- 7. 为什么`优于`输入@ input`装饰:[]`
- 8. 成本装饰者
- 9. 为什么我会用装饰者的责任链?
- 10. 我应该什么时候使用装饰者?
- 11. 什么时候应该使用装饰/观察者?
- 12. 装饰器“implements_iterator”的功能是什么?
- 13. 为什么我需要用@method_decorator装饰login_required装饰器
- 14. 为什么装饰失败?
- 15. 装饰者模式是否违反SRP?
- 16. 为什么Angular 2使用装饰器?
- 17. 装饰者的工作
- 18. django user_passes_test装饰者is_superuser
- 19. 装饰者图案,头先
- 20. 装饰者在Python-Flask
- 21. 装饰者Spree ::变种
- 22. WinForms中的WPF装饰者
- 23. SimpleInjector - 装饰者不开火?
- 24. 装饰者得到自我
- 25. @瞬间vs装饰者
- 26. 拦截器vs装饰者
- 27. Python装饰器和装饰器模式有什么区别?
- 28. 为什么在装饰设计模式命名为“装饰”?
- 29. 装饰器是不同于装饰器的功能类吗?
- 30. 这是一个装饰者还是战略模式,或者两者都不是?
到目前为止发现了什么? – Tadeck
@Bakuriu我不认为这是重复的这个问题是关于“为什么”。你提到的那个是关于“如何”。 – luc
@Tadeck我发现它可以在执行装饰函数之前和之后添加额外的代码。还有其他用法? – hbprotoss