关于python装饰器的问题

这里函数man和woman分别作为func1的参数了嘛?如果是的话为什么会这样,,装饰器不应该是arg_func,函数man和,woman作为arg_func的参数吗... 这里 函数 man和 woman分别作为func1的参数了嘛?如果是的话为什么会这样,,装饰器不应该是arg_func,函数man和,woman作为 arg_func的参数吗 展开
 我来答
自我编程
2019-08-05 · 科技优质答主
自我编程
采纳数:1481 获赞数:4279

向TA提问 私信TA
展开全部

装饰器函数参数要传函数,而不是字符串。

装饰器函数特点:

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:装饰器就是为了简化代码,增加可读性,方便团队开发,在不修改原函数代码的前提下,通过封装修改功能,而@修饰就是为了通过原函数名调用时,不直接执行原函数,而是把原函数传递到装饰器函数,通过内部函数(闭包)来调用原函数。这样好处,就是统一调用方式。

GTA小鸡
高粉答主

2019-08-04 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.6万
采纳率:78%
帮助的人:1.3亿
展开全部
假设有带参装饰器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'。因此,这种带参的装饰器通常有三层,外层装饰器返回内层装饰器,内层装饰器返回装饰后的函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式