当前位置: 首页 > 面试题库 >

装饰器执行顺序

仰城
2023-03-14
问题内容
def make_bold(fn):
    return lambda : "<b>" + fn() + "</b>"

def make_italic(fn):
    return lambda : "<i>" + fn() + "</i>"

@make_bold
@make_italic
def hello():
  return "hello world"

helloHTML = hello()

输出: "<b><i>hello world</i></b>"

我大致了解装饰器,以及在大多数示例中它如何与装饰器一起使用。

在此示例中,有2个。从输出看,似乎@make_italic先执行,然后执行@make_bold

这是否意味着对于装饰功能,它将首先运行该功能,然后移至其他装饰器的顶部?像@make_italic先那么@make_bold,而不是相反。

所以这意味着它与大多数编程语言中的自顶向下方法的规范不同吗?仅用于这种装饰器吗?还是我错了?


问题答案:

装饰器 包装 正在装饰的功能。这样就make_bold修饰了make_italic装饰器的结果,从而修饰了hello功能。

@decorator语法真的只是语法糖; 以下:

@decorator
def decorated_function():
    # ...

实际执行为:

def decorated_function():
    # ...
decorated_function = decorator(decorated_function)

用返回的内容替换原始decorated_function对象decorator()

堆叠装饰器会 向外 重复该过程。

因此,您的示例:

@make_bold
@make_italic
def hello():
  return "hello world"

可以扩展为:

def hello():
  return "hello world"
hello = make_bold(make_italic(hello))

当你打电话hello()了,你调用返回的对象make_bold(),真的。make_bold()返回一个lambda,调用make_bold包装的函数,这是的返回值make_italic(),它也是一个调用原始函数的lambda
hello()。扩展所有这些调用,您将得到:

hello() = lambda : "<b>" + fn() + "</b>" #  where fn() ->
    lambda : "<i>" + fn() + "</i>" # where fn() -> 
        return "hello world"

因此输出变为:

"<b>" + ("<i>" + ("hello world") + "</i>") + "</b>"


 类似资料:
  • 问题内容: 我正在尝试由两个装饰器装饰Django视图,一个装饰器用于检查登录,另一个用于检查is_active。 第一个是内置的,第二个如下: 现在,Python中的装饰器可以由内而外工作,但是以下操作不起作用: 我想首先检查用户是否已登录,如果没有,请重定向到登录页面,如果他或她已登录,则要检查他或她是否处于活动状态,如果不是,则执行重定向到。 发生的情况是,如果login_required失

  • 我在Ant中使用Sonar,导入Cobertura和单元测试结果,并通过设置“Sonar+FindBugs”运行代码质量分析。我以前已经能够用声纳分析我的(大型)项目。我不知道,也许我做了一些改变,但现在分析不再完成了。声纳已经成功导入了Cobertura报告,然后它试图执行装饰器,但它只是挂起(几个小时): P.PhasestimeProfiler-执行装饰器... 我已经在Windows7和R

  • 问题内容: 举个例子: 我遇到的问题是,甚至在我调用要装饰的函数之前就调用了。 开始输出: 在这一点上,我什至没有调用过一个装饰过的函数。 我刚刚开始使用装饰器,所以也许我缺少了一些东西。 问题答案: 我相信python装饰器只是语法糖。 和…一样 如您所见,即使没有调用 bar 也将调用 foo 。这就是为什么您看到装饰器函数的输出的原因。对于您将装饰器应用到的每个函数,您的输出应只包含一行。

  • Django为视图提供了数个装饰器,用以支持相关的HTTP服务。 允许的HTTP 方法 django.views.decorators.http 包里的装饰器可以基于请求的方法来限制对视图的访问。若条件不满足会返回 django.http.HttpResponseNotAllowed。 require_http_methods(request_method_list)[source] 限制视图只能

  • 装饰器(Decorators)(被babel支持, 在 03/17 之后作为stage-2的proposal被引入) 如果你在使用类似于mobx的库, 你能够使用装饰器装饰你的函数. 装饰器本质上其实就是将组件传入一个函数. 使用装饰器能让组件更灵活,更可读并且更易修改组件的功能. 不使用装饰器的例子 class ProfileContainer extends Component { //

  • 上一篇文章将通过解决一个需求问题来了解了闭包,本文也将一样,通过慢慢演变一个需求,一步一步来了解 Python 装饰器。 首先有这么一个输出员工打卡信息的函数: def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch() 输出的结果如下: 昵称:两点水 部门:做鸭事业部 上班打卡成功 然后,产品反馈,不行啊,怎么上班打卡没有具体的日