4

在最近阅读这篇关于 Python 装饰器的文章时,它举例说明了作为 Python 装饰器应用程序的记忆技术。虽然我对 Python 装饰器有一定的了解,但我希望了解更多这样有效的装饰器用例,以及您通常如何在日常代码中使用它们。

4

4 回答 4

2

有许多可用的内置装饰器,例如classmethodpropertystaticmethodfunctools.wrap。编写一个装饰器来记录函数的使用情况以进行调试通常很方便。这个 Python wiki 页面上有很多示例装饰器,尽管我认为至少其中一些更旨在展示 Python 的灵活性,而不是实际提供有用的功能。

于 2012-04-12T12:18:32.587 回答
2

由于 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'>
于 2012-04-12T12:27:46.377 回答
0

auth 您可以在 Django Web 框架文档中查看 Python 装饰器的有效用例。明显的例子(我个人每天都在使用)包括使用装饰器来限制经过身份验证的用户的视图根据特定的用户权限限制访问等。

于 2012-04-12T12:14:23.423 回答
0

这是一个实际的例子。看看有没有备忘录的斐波那契数列总和。

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)
...
于 2012-04-12T12:17:25.017 回答