了解Djang的装饰师

2024-04-23 11:00:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试为基于函数的视图构建自己的装饰器。你知道吗

我理解了装潢师背后的基本概念,但我仍在努力完全理解“幕后”发生了什么。你知道吗

我有一个例子装饰。有人能给我解释一下这里发生了什么或者它是怎么工作的吗?为什么我们需要这么多功能呢?你知道吗

def active_user_required():

    def decorator(function):
        def wrapper(request, *args, **kw):
            if request.user.is_active:
                return function(request, *args, **kw)
            else:
                raise PermissionDenied()
        return wrapper
    return decorator

Tags: 函数视图returnrequestdefargsfunction装饰
1条回答
网友
1楼 · 发布于 2024-04-23 11:00:20

理解Python中的decorator的关键在于:Python中的函数是一级对象。这意味着它们可以作为参数传递,也可以作为值返回(等等)。你知道吗

最简单的形式是,decorator将函数作为参数,并返回扩展其功能的新函数。例如,这里有一个decoratorplusone,它将1添加到原始函数的返回值中:

>>> def plusone(f):
...     def wraps(*a):
...             return f(*a) + 1
...     return wraps
...
>>>
>>> @plusone
... def add(x, y):
...     return x + y
...
>>>
>>> add(1, 2)
4

重申一下,plusone的要点不是它“加1”,而是它创建了一个新函数(在本例中称为wraps),并返回。在最后一行,当add(1, 2)被调用时,实际上是函数wraps被调用(回忆一下,它调用了原始的add函数)。你可以证明:

>>> add
<function wraps at 0x107b88578>

(如果没有decorator,也就是说<function add at 0x...>

这可以扩展到更复杂的情况,例如采用自己论点的装饰器,但我不认为这些细节是问题的根源。关键的一点是,decorator将函数作为参数,然后返回一个函数(返回的函数几乎总是以某种方式扩展传递的函数)。你知道吗

希望有帮助。你知道吗

相关问题 更多 >