python装饰器,自己实现一个简单的装饰器
来源:互联网 发布:360检测网络异常 编辑:程序博客网 时间:2024/05/09 21:05
装饰器演变过程
1.先来看个方法:
def add(x,y): return x+y
- 1
- 2
- 3
其功能显而易见,实现一个加法,boss觉得这个功能太单一,需要加些功能1,校验(因为python是强类型语言,int 和string 无法直接相加.)2.相加后输出到文件等操作.
2.于是修改代码如下,这个也是改代码最常见的一种:
def add(x,y): if type(x)!=type(y): print("类型不一致请重试") return z=x+y f=open('C:\\Users\\Public\\Documents\\test.txt','w') f.write(str(z)) f.close() print("finish")add(2,3)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
这样的弊端有二:1.破坏了程序高内聚低耦合原则2,加法器函数已经变了味.
3.so根据python的引用特性把加法器封装为高级函数(参数or返回值是函数),我们这里将add函数作为参数传入,代码如下:
def add(x,y): return x+ydef logger(fn): if type(x)!=type(y): print("类型不一致请重试") return z=fn(x,y) f = open('C:\\Users\\Public\\Documents\\test.txt', 'w') f.write(str(z)) f.close() print("finish")x,y=4,7logger(add)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
4.函数的参数x,y没有封装到函数里面,于是修改代码如下:
def logger(fn,x,y): if type(x)!=type(y): print("类型不一致请重试") return z=fn(x,y) f = open('C:\\Users\\Public\\Documents\\test.txt', 'w') f.write(str(z)) f.close() print("finish")logger(add,5,8)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
5.为了提高复用性,add三个参数的情况,将logge修改为可变的参数
def logger(fn,*args,**kwargs): if type(args[0])!=type(args[1]): print("类型不一致请重试") return z=fn(*args,**kwargs) f = open('C:\\Users\\Public\\Documents\\test.txt', 'w') f.write(str(z)) f.close() print("finish")logger(add,5,8)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
6.柯里化后代码如下:
def logger(fn): def wrapper(*args,**kwargs): if type(args[0]) != type(args[1]): print("类型不一致请重试") return z = fn(*args, **kwargs) f = open('C:\\Users\\Public\\Documents\\test.txt', 'w') f.write(str(z)) f.close() print("finish") return wrapperlogger(add)(4,1)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
7.最终我们看到了一个装饰器,使用时候在原方法上面加@装饰器名即可,完整代码如下:
def logger(fn): def wrapper(*args,**kwargs): if type(args[0]) != type(args[1]): print("类型不一致请重试") return z = fn(*args, **kwargs) f = open('C:\\Users\\Public\\Documents\\test.txt', 'w') f.write(str(z)) f.close() print("finish") return wrapper@logger # add1 = logger(add1)def add(x,y): ret = x + y return retadd(12,56)
阅读全文
0 0
- python装饰器,自己实现一个简单的装饰器
- python装饰器,自己实现一个简单的装饰器
- python装饰器,自己实现一个简单的装饰器
- 一个简单的装饰器
- 一个基于python简单的装饰器实例
- python的装饰器的简单案例
- 关于python的装饰器简单实用
- python中装饰器的简单用法
- 简单地理解 Python 的装饰器
- 简单地理解 Python 的装饰器
- 简单地理解 Python 的装饰器
- 记下一个python装饰器的例子
- Python的装饰器
- python的装饰器
- python的装饰器
- Python的装饰器
- python的装饰器
- Python的装饰器
- Linux下查看进程命令
- Dockerfile 第5关:ONBUILD和VOLUME指令
- C#的枚举数(Enumerator)和可枚举类型(Enumerable)
- 复制拼接数组,取数组指定部分
- 递归回溯法解决八妃问题
- python装饰器,自己实现一个简单的装饰器
- 每日一记:2017.11.24
- Bluetooth LE(低功耗蓝牙) 系列
- 务隔离级别详解
- windpws 10打开开发模式后安装ubuntu后如何连接其桌面
- NodeMCU中Out Of Memory的解决方法
- Java反射机制
- lucence maven
- 扫描识别工具Dynamic Web TWAIN使用教程:建立一个“Hello World”扫描页面