当前位置: 首页 > 知识库问答 >
问题:

Python装饰器?-有人能解释一下吗?

曹旭东
2023-03-14

抱歉,这是一个非常广泛的问题。

下面的代码是在网上找到的东西的片段。我感兴趣的关键是@protected开头的一行——我想知道这是做什么的,它是如何做到的?在执行do_upload_ajax函数之前,它似乎正在检查有效用户是否登录。这看起来是一种非常有效的用户身份验证方法。不过,我不明白这个@函数的机制——有人能告诉我正确的方向,解释一下这将如何在现实世界中实现吗?Python 3请回答。谢谢。

@bottle.route('/ajaxupload', method='POST')
@protected(check_valid_user) 
def do_upload_ajax():
    data = bottle.request.files.get('data')
    if data.file:
        size = 0

共有3个答案

微生俊健
2023-03-14

decorator语法:

@protected(check_valid_user) 
def do_upload_ajax():
    "..."

相当于

def do_upload_ajax():
    "..."
do_upload_ajax = protected(check_valid_user)(do_upload_ajax)

但不需要重复同一个名字三次。没有别的了。

例如,下面是一个可能的实现protected()

import functools

def protected(check):
    def decorator(func): # it is called with a function to be decorated
        @functools.wraps(func) # preserve original name, docstring, etc
        def wrapper(*args, **kwargs):
            check(bottle.request) # raise an exception if the check fails
            return func(*args, **kwargs) # call the original function
        return wrapper # this will be assigned to the decorated name
    return decorator
伯逸明
2023-03-14

decorator是一个函数,它将函数作为其唯一参数并返回函数。这有助于反复使用相同的代码“包装”功能。

我们使用@func_name指定要应用于另一个函数的装饰器。

下面的示例将欢迎消息添加到fun()返回的字符串中。将fun()作为参数并返回welcome()。

def decorate_message(fun):

    # Nested function
    def addWelcome(site_name):
        return "Welcome to " + fun(site_name)

    # Decorator returns a function
    return addWelcome

@decorate_message
def site(site_name):
    return site_name;

print site("StackOverflow")

Out[0]: "Welcome to StackOverflow"

装饰器在将数据(或添加属性)附加到函数时也很有用。

将数据附加到func的装饰函数

def attach_data(func):
       func.data = 3
       return func

@attach_data
def add (x, y):
       return x + y

print(add(2, 3))
# 5    
print(add.data)
# 3
季城
2023-03-14

好好看看这个巨大的答案/小说。这是我遇到的最好的解释之一。

我能给出的最简短的解释是,修饰符将您的函数包装在另一个返回函数的函数中。

这个代码,例如:

@decorate
def foo(a):
  print a

如果删除decorator语法,则与此代码等效:

def bar(a):
  print a

foo = decorate(bar)

装饰器有时需要参数,这些参数被传递给动态生成的函数来改变它们的输出。

你应该阅读的另一个术语是封闭,因为这是允许装饰者工作的概念。

 类似资料:
  • 问题内容: 抱歉,这是一个非常广泛的问题。 以下代码是网络上某些内容的片段。我感兴趣的关键是从@protected开始的行- 我想知道这是做什么的以及它是如何做到的?在执行do_upload_ajax函数之前,似乎正在检查是否已登录有效用户。这似乎是进行用户身份验证的一种非常有效的方法。我不了解此@函数的机制- 有人可以引导我正确的方向来解释如何在现实世界中实现它吗?Python 3请回答。谢谢。

  • 我想写一个brainfuck口译员,但我错过了一些上下文或其他东西。应该被调用以处理“

  • 我是Hibernate和JPA的新手,我对这个注释有问题。有人能简单地解释一下这个注释到底在做什么吗?因为在这种情况下,文档对我来说很难理解。 编辑我明白什么是持久上下文,但在代码中,我有这样的例子: 我对@PerustenceContext做什么有问题。抱歉,也许我没有具体说明。

  • 问题内容: 这是python装饰器的示例。我无法理解它的工作方式。请向我解释给定示例的控制流程。我将非常有义务。 问题答案: 装饰器是在Python中应用高阶函数的语法糖。高阶函数是将一个或多个函数作为输入并返回一个函数的函数。即 这里是一个高阶函数,它接受单个参数的函数,并返回单个参数的函数。您可以将其视为修改的行为。 高阶函数是可组合的(根据定义),因此在您的特定示例中,装饰器语法, 等价于

  • 我不知道“?”和“:”的用法。