python3 如何给装饰器传递参数,python3参数,【引子】 之前写过
python3 如何给装饰器传递参数,python3参数,【引子】 之前写过
【引子】
之前写过一篇文章用来讲解装饰器(https://www.cnblogs.com/JiangLe/p/9309330.html) 、那篇文章的定位是入门级的
所以也就没有讲过多的高级主题,决定在这里讲一下如果为装饰器传递参数
【目标】
我们有两个函数“add_fun”、“add” 其中“add_fun”已经过时、如果用户有调用这个函数的话就提示它“add_fun”已经过时并且引导
它去调用“add”函数
【add\add_fun函数的定义】
def add_fun(x,y): """ 实现两个数相加、并返回合 """ return x+ydef add(x,y): """ 实现两个数相加、并返回合 """ return x+y
【通过装饰器引导调用add_fun的用户去调用add】
def deprecated(fun,new_fun_name): """deprecated函数会返回一个叫inner的函数、inner函数会返回 fun调用的结果,与直接调用fun得到值不同的是inner会先打印一行提示 表明fun已经过时 """ def inner(x,y): print("{fun.__name__} 函数已经过时 请使用{new_fun_name}".format(fun=fun,new_fun_name=new_fun_name)) return fun(x,y) return innerdef add_fun(x,y): """ 实现两个数相加、并返回合 """ return x+yadd_fun = deprecated(add_fun,‘add‘)def add(x,y): """ 实现两个数相加、并返回合 """ return x+y if __name__=="__main__": print(add_fun(1,1))
调用时的输出如下:
python3 dc.pyadd_fun 函数已经过时 请使用add2
【难道为装饰器增加参数就这么的简单】
仔细的你可能已经发现了、我们在上面的代码里并没有用装饰器的语法糖衣、而是通过函数调用的方式来包装的add_fun方法
add_fun = deprecated(add_fun,‘add‘)
机智的你应该想到了@deprecated(‘add‘) 这样去装饰add_fun应该也能成吧!于是代码如下(关键代码)
@deprecated(‘add‘)def add_fun(x,y): """ 实现两个数相加、并返回合 """ return x+y
当你调用时会发现完全不是你想要的那样、
python3 dc.pyTraceback (most recent call last): File "dc.py", line 12, in <module> @deprecated(‘add‘)TypeError: deprecated() missing 1 required positional argument: ‘new_fun_name‘
事实上目前语法糖衣只解决了最简单的情况、如果你要给@写法 指定参数还要另寻它法。
【真理简洁而有力】
linux的世界里有句话“一切皆文件”,python的世界里也有一句话“一切皆对象”; 但是关键不是会“背”,而是“领悟”。
一个经典的糖衣格式是这样的
@decoratedef fun(): pass
请仔细看一下不难发现@后面直接是对象名、由python的数据模式可知、对象名只是一个对象的标识;也就是说@后面是一个对象!对象可以
是已经定义好的,也可以是调用才生成。明白这一层道理之后事情就比较好办了,我们只要在调用时生成“装饰”对象就可以了,因为要调用
所以就给了我们传递参数的机会。
【触摸真理一】
用调用时生成的对象用作装饰器
def deprecated(new_fun_name): """derepcated 装饰器把函数标记为过时 """ def warpper(fun): """ """ def inner(*args): print("{0} 函数已经过时 请使用 {1}".format(fun.__name__,new_fun_name)) return fun(*args) return inner return warpperdecorator = deprecated(‘add‘) # 特意把这一步单独分离出来、用于说明什么叫调用时创建的对象用作做装饰器@decorator # 特意把这一步单独分离出来、用于说明什么叫调用时创建的对象用作做装饰器def add_fun(x,y): """ 实现两个数相加、并返回合 """ return x+ydef add(x,y): """ 实现两个数相加、并返回合 """ return x+y if __name__=="__main__": print(add_fun(1,1))
【触摸真理二】
与语法糖衣结合、完成传递参数的目的
def deprecated(new_fun_name): """derepcated 装饰器把函数标记为过时 """ def warpper(fun): """ """ def inner(*args): print("{0} 函数已经过时 请使用 {1}".format(fun.__name__,new_fun_name)) return fun(*args) return inner return warpper@deprecated(‘add‘)def add_fun(x,y): """ 实现两个数相加、并返回合 """ return x+ydef add(x,y): """ 实现两个数相加、并返回合 """ return x+y if __name__=="__main__": print(add_fun(1,1))
调用时输出如下
python3 dc.pyadd_fun 函数已经过时 请使用 add2
总结:
如果只能用一名话概括python我想对简洁的应该是“一切皆对象”了吧。
python3 如何给装饰器传递参数
相关内容
- Python 项目转.so动态库,python.so动态库,最近, 作者遇到一
- python数据类型之可hash,不可hash,pythonhash,可变类型的数
- python中的数据类型转换,python数据类型转换,今天想要写
- python读取xml文件报错ValueError: multi-byte encodings are not s
- python实现原地刷新方式输出-可用于百分比进度显示输出
- Python爬虫教程:爬取付费电影,告别费钱的日子,,今天
- Python小白必备的8个最常用的内置函数,,Python给我们内
- 【python+selenium自动化】使用pytest+allure2完成自动化测试
- Python-23_装饰器-04_练习---无参装饰器、有参装饰器,,一
- python各个模块循环引用问题解决办法,,当项目中的模块
评论关闭