最近在Python裝飾器上閱讀這個article,它舉例說明了memoization作爲Python裝飾器應用的技術。雖然我對Python裝飾器有一個很好的理解,但我希望知道裝飾器的更多有效用例,以及您如何在日常代碼中使用它們。Python裝飾器的典型應用和使用案例
回答
您可以查看Django Web框架中的Python裝飾器的有效用例auth
docs。清晰的例子(我每天親自使用)包括restricting views to authenticated users,restricting access depending on specific user permissions等的裝飾器的使用。
這是一個實際的例子。看看斐波那契的系列總和和沒有備忘錄。
from functools import wraps
def memo(func):
cache = {}
@wraps(func)
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrap
def fib(i):
if i < 2: return 1
return fib(i-1) + fib(i-2)
@memo
def fib_memo(i):
if i < 2: return 1
return fib_memo(i-1) + fib_memo(i-2)
現在測試速度差!
>>> print fib(200)
...
>>> print fib_memo(200)
...
這是我在問題的鏈接中提到的確切例子。在這種情況下裝飾器的用處促使我尋求像這樣的進一步用例:) – subiet 2012-04-12 12:21:10
@subiet我沒有閱讀文章,經典的例子,它幾乎看起來像一個精確的複製粘貼:)。無論如何,當你使用算法時,節點和圖形備忘錄用於消除所謂的遞歸複雜性(在分區和搜索中尤其有用)。 – luke14free 2012-04-12 12:24:28
有一些內置的裝飾,可以是有用的,如classmethod
,property
,staticmethod
,並functools.wrap
的。編寫一個裝飾器來記錄函數的使用情況以便進行調試通常很方便。 this Python wiki page上有很多示例裝飾器,但我認爲其中至少有一些更多的目的是展示Python的靈活性,而不是實際提供有用的功能。
由於Python 3支持類型註釋,因此可以使用裝飾器作爲檢查方法。
def check(f):
def _f(x):
if type(x) != f.__annotations__['x']:
raise TypeError(type(x))
val = f(x)
if 'return' in f.__annotations__ and f.__annotations__['return'] != type(val):
raise TypeError(type(val))
return val
return _f
@check
def f(x: int) -> int:
return x * 2
>>> f(2)
4
>>> f('x')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in _f
TypeError: <class 'str'>
- 1. Python裝飾器示例
- 2. 使用python裝飾器來裝飾功能的一部分
- 3. Python裝飾器的正確使用
- 4. Python裝飾器創建字典
- 5. 棄用應用裝飾器
- 6. Python實例方法上的裝飾器
- 7. Python:使用相同的裝飾器來裝飾__call__和普通函數?
- 8. Python裝飾器和繼承
- 9. Python裝飾器和類
- 10. 使用Rails實現裝飾器應用
- 11. Python裝飾器
- 12. 使用python裝飾器有無括號
- 13. Python成員函數裝飾器使用實例作爲參數
- 14. Python裝飾3.0和裝飾的參數
- 15. Python裝飾器和裝飾器模式有什麼區別?
- 16. 動態實例化使用裝飾圖案類在PHP
- 17. 在Python中裝飾裝飾器
- 18. Python memoization裝飾器
- 19. 裝飾圖案
- 20. python調用序列中的裝飾器
- 21. 使用Pylons驗證和authenticate_form裝飾器
- 22. Sitemesh 2.4.2:如何使用除裝飾器之外的裝飾器
- 23. 使用裝飾器,(rails)無法推斷ActiveRecord :: Base的裝飾器
- 24. 爲什麼我應該在python中使用@property裝飾器?
- 25. 使用@login_required裝飾器
- 26. 如何使用裝飾器?
- 27. 如何使用mock_open和Python UnitTest裝飾器?
- 28. 如何在unittest lib中使用python模擬庫和裝飾器?
- 29. 在類方法和子類方法上使用python裝飾器
- 30. python中的裝飾器
的[什麼是memoization的好,是不是真的那麼有用嗎?]可能重複(http://stackoverflow.com/questions/3242597/what-is-memoization-good-for-and-is - 真的,所有有用的) – detly 2012-04-12 12:19:13
我意識到重複不是特定於Python的,但我認爲它會回答你的問題。 – detly 2012-04-12 12:21:25
@detly其實不,我的問題根本不是關於記憶,我只是想用一個例子來說明。我的問題具體是關於python裝飾器和它們的好用例如備忘錄 – subiet 2012-04-12 12:24:10