Python装饰器实践之命令行工具
来源:互联网 发布:html用什么软件编写 编辑:程序博客网 时间:2024/06/16 15:45
在面向对象中装饰器也被成为装饰器模式,Python在语法层对装饰器提供了支持.在工作中,我也经常使用Python的这个特性.在不改变原有代码的同时,对程序功能进行扩展,同时也能有效地降低各模块间的耦合度,提高代码的可重用性和开发效率.
在我的另外一篇博客Python的AOP利器:装饰器,也对装饰器进行了介绍.使用@foo
形式的装饰器本质上是执行foo
这个callable
对象,参数是被装饰的对象.因此,其意义与foo(func)
相同.此时,对该可执行对象的调用类似执行foo(func)(*args,**kwargs)
.
ugly-code是我开发的一个工具库,其中的命令行模块就是使用Python的装饰器实现的.
# 克隆项目到本地$ git clone https://git.oschina.net/irealing/ugly-code.git# 编译项目,此操作会在dist目录生成可以用 pip 工具安装的whl文件$ python3 setup.py bdist_wheel# 安装依赖$ pip install dist/ugly_code****.whl
安装该依赖,创建cmd_debug.py
,内容如下:
from ugly_code.cmd import Command@Commanddef main(a: int, b: str = "default"): print("{} {}".format(a, b))if __name__ == '__main__': main()
执行该脚本会发现,main
函数被包装为一个可以处理命令行参数的脚本.有默认值的参数会被设置为可选参数,无默认值则设置为必选.使用Type Hints的参数亦可自动进行类型检查.
在当前目录下,执行python3 -c 'from cmd_debug import main;print(type(main))'
观察输出:
mars:ugly-code/ (master) $ python3 -c 'from cmd_debug import main;print(type(main))'<class 'ugly_code.cmd.Command'>
我们可以发现,main
函数的类型变成了ugly_code.cmd.Command
.
ugly_code.cmd.Command
是一个类,也是一个装饰器,主要代码如下:
class Command(object): """ Command object """ def __init__(self, func): self.func=func def __call__(self): args=self.parse_args() return self.func(*args)
Command
的__init__
方法接收一个函数类型的参数func
,在__call__
函数调用时对命令行参数进行解析,并执行了func
函数.所以上面的例子中函数main
的类型变成了ugly_code.cmd.Command
.
该工具的完成代码可在irealing/ugly-code - 码云 - 开源中国看到:)
author:Memory_Leak
- Python装饰器实践之命令行工具
- Python的装饰器实践
- python之装饰器
- Python之装饰器
- Python 之 decorator装饰器
- Python 之 decorator 装饰器
- python学习之装饰器
- Python学习之装饰器
- python系列之 - 装饰器
- python之装饰器模式
- Python之装饰器函数
- python之装饰器decorator
- Python进阶之装饰器
- Python进阶之装饰器
- Python进阶之装饰器
- Python装饰器之 property()
- python学习之装饰器
- Python之装饰器学习
- 并查集
- Android Studio环境搭建
- makefile文件的简单知识
- 想学编程的同学,我给你一点点建议
- NoSQL 之 MongoDB
- Python装饰器实践之命令行工具
- 完绘质勘Datamine.Studio.EM/OP.v2.1.170.0
- 图
- jvm及运行机制
- Bootstrap学习笔记(四)
- JAVA实现“斐波那契数列”
- 斯坦福大学机器学习笔记--第二周(1.多元线性回归及多元线性回归的梯度下降)
- 教你一招屏蔽百度联盟广告
- 部署描述文件web.xml解析(四) 分配名称和自定义URL