关于python装饰器的问题
这里函数man和woman分别作为func1的参数了嘛?如果是的话为什么会这样,,装饰器不应该是arg_func,函数man和,woman作为arg_func的参数吗...
这里 函数 man和 woman分别作为func1的参数了嘛?如果是的话为什么会这样,,装饰器不应该是arg_func,函数man和,woman作为 arg_func的参数吗
展开
2个回答
展开全部
装饰器函数参数要传函数,而不是字符串。
装饰器函数特点:
1,参数为函数对象
2,使用内部函数
3,返回函数对象
在你的代码中:
装饰器函数是arg_func(sex)
内部函数是func1()
被装饰函数是man()和woman()
所以代码要改成:
def arg_func(sex):
def func1():
sex()
if(sex.__name__=='man'):
print("you can 't")
if(sex.__name__=='woman'):
print("you can")
return func1
@arg_func
def man():
print('good good study')
@arg_func
def woman():
print('good good study')
man()
woman()
PS:装饰器就是为了简化代码,增加可读性,方便团队开发,在不修改原函数代码的前提下,通过封装修改功能,而@修饰就是为了通过原函数名调用时,不直接执行原函数,而是把原函数传递到装饰器函数,通过内部函数(闭包)来调用原函数。这样好处,就是统一调用方式。
展开全部
假设有带参装饰器decorator(*args, **kwargs),使用该装饰器装饰函数func(*args2, **kwargs2):
@decorator(*args, **kwargs)
def func(*args2, **kwargs2):
...
实际上是以下写法的语法糖:
def func(*args2, **kwargs2):
...
func = decorator(*args, **kwargs)(func)
如你所见,调用decorator(*args, **kwargs)返回的是一个callable对象(通常是一个函数,该函数用作内层装饰器),然后进一步调用此callable对象并传递函数func作为参数,得到一个被装饰过后的函数func',令变量func重新指向这个函数func'。因此,这种带参的装饰器通常有三层,外层装饰器返回内层装饰器,内层装饰器返回装饰后的函数。
@decorator(*args, **kwargs)
def func(*args2, **kwargs2):
...
实际上是以下写法的语法糖:
def func(*args2, **kwargs2):
...
func = decorator(*args, **kwargs)(func)
如你所见,调用decorator(*args, **kwargs)返回的是一个callable对象(通常是一个函数,该函数用作内层装饰器),然后进一步调用此callable对象并传递函数func作为参数,得到一个被装饰过后的函数func',令变量func重新指向这个函数func'。因此,这种带参的装饰器通常有三层,外层装饰器返回内层装饰器,内层装饰器返回装饰后的函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询