python装饰器,自己实现一个简单的装饰器

装饰器演变过程

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+y

def 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,7
logger(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 wrapper

logger(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 ret

add(12,56)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值