python装饰器传递参数_python3 如何给装饰器传递参数

【引子】

所以也就没有讲过多的高级主题,决定在这里讲一下如果为装饰器传递参数

【目标】

我们有两个函数“add_fun”、“add” 其中“add_fun”已经过时、如果用户有调用这个函数的话就提示它“add_fun”已经过时并且引导

它去调用“add”函数

【add\add_fun函数的定义】

defadd_fun(x,y):"""实现两个数相加、并返回合"""

return x+ydefadd(x,y):"""实现两个数相加、并返回合"""

return x+y

【通过装饰器引导调用add_fun的用户去调用add】

defdeprecated(fun,new_fun_name):"""deprecated函数会返回一个叫inner的函数、inner函数会返回

fun调用的结果,与直接调用fun得到值不同的是inner会先打印一行提示

表明fun已经过时"""

definner(x,y):print("{fun.__name__} 函数已经过时 请使用{new_fun_name}".format(fun=fun,new_fun_name=new_fun_name))returnfun(x,y)returninnerdefadd_fun(x,y):"""实现两个数相加、并返回合"""

return x+y

add_fun= deprecated(add_fun,'add')defadd(x,y):"""实现两个数相加、并返回合"""

return x+yif __name__=="__main__":print(add_fun(1,1))

调用时的输出如下:

python3 dc.py

add_fun 函数已经过时 请使用add2

【难道为装饰器增加参数就这么的简单】

仔细的你可能已经发现了、我们在上面的代码里并没有用装饰器的语法糖衣、而是通过函数调用的方式来包装的add_fun方法

add_fun = deprecated(add_fun,'add')

机智的你应该想到了@deprecated('add') 这样去装饰add_fun应该也能成吧!于是代码如下(关键代码)

@deprecated('add')defadd_fun(x,y):"""实现两个数相加、并返回合"""

return x+y

当你调用时会发现完全不是你想要的那样、

python3 dc.py

Traceback (most recent calllast):

File"dc.py", line 12, in @deprecated('add')

TypeError: deprecated() missing1 required positional argument: 'new_fun_name'

事实上目前语法糖衣只解决了最简单的情况、如果你要给@写法 指定参数还要另寻它法。

【真理简洁而有力】

linux的世界里有句话“一切皆文件”,python的世界里也有一句话“一切皆对象”; 但是关键不是会“背”,而是“领悟”。

一个经典的糖衣格式是这样的

@decoratedeffun():pass

请仔细看一下不难发现@后面直接是对象名、由python的数据模式可知、对象名只是一个对象的标识;也就是说@后面是一个对象!对象可以

是已经定义好的,也可以是调用才生成。明白这一层道理之后事情就比较好办了,我们只要在调用时生成“装饰”对象就可以了,因为要调用

所以就给了我们传递参数的机会。

【触摸真理一】

用调用时生成的对象用作装饰器

defdeprecated(new_fun_name):"""derepcated 装饰器把函数标记为过时"""

defwarpper(fun):"""

"""

def inner(*args):print("{0} 函数已经过时 请使用 {1}".format(fun.__name__,new_fun_name))return fun(*args)returninnerreturnwarpper

decorator= deprecated('add') #特意把这一步单独分离出来、用于说明什么叫调用时创建的对象用作做装饰器

@decorator#特意把这一步单独分离出来、用于说明什么叫调用时创建的对象用作做装饰器

defadd_fun(x,y):"""实现两个数相加、并返回合"""

return x+ydefadd(x,y):"""实现两个数相加、并返回合"""

return x+yif __name__=="__main__":print(add_fun(1,1))

【触摸真理二】

与语法糖衣结合、完成传递参数的目的

defdeprecated(new_fun_name):"""derepcated 装饰器把函数标记为过时"""

defwarpper(fun):"""

"""

def inner(*args):print("{0} 函数已经过时 请使用 {1}".format(fun.__name__,new_fun_name))return fun(*args)returninnerreturnwarpper

@deprecated('add')defadd_fun(x,y):"""实现两个数相加、并返回合"""

return x+ydefadd(x,y):"""实现两个数相加、并返回合"""

return x+yif __name__=="__main__":print(add_fun(1,1))

调用时输出如下

python3 dc.py

add_fun 函数已经过时 请使用 add2

总结:

如果只能用一名话概括python我想对简洁的应该是“一切皆对象”了吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值