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() 输出的结果如下: 昵称:两点水 部门:做鸭事业部 上班打卡成功 然后,产品反馈,不行啊,怎么上班打卡没有具体的日