Python修饰器实现及作用

定义一个函数f

def f(x):
    return x * x

现在我们想在其中实现打印日志功能
我们可以更改原函数

def f(x):
    print(f.__name__)
    return x * x

如果不改变原函数,有没有实现方式呢?
有,定义一个高阶函数,我们知道函数可以指向一个变量,函数也可以返回一个函数,知道这些我们便可以实现增加打印日志的功能

def log(a):
    def fn(x):
        print(a.__name__)
        return a(x)

    return fn

首先定义一个log函数,return执行fn函数,最后再return执行另一个a函数,注意a为变量
执行一下

g = log(f)
print(g(2))

结果

f
4

上面我们采用了变量g去接受log函数,所以并不会改变原函数

print("->", f(3))
-> 9

但是我们知道函数也可以指向另一个函数

f = log(f)
print(f(2))
f
4

结果是一样的,但是此方法也同时屏蔽了原函数f

print("->", f(3))
f
-> 9

如果想在多个函数上执行打印日志的功能,Python提供了@函数名的修饰器方法,可以减少代码,减少重复函数调用

@log
def b(y):
    return y + y


print(b(5))
b
10

修饰器执行的原理其实就是

def f(x):
    return x * x
f = log(f)

----------有参修饰器----------

def sum(x, y):
    return x * y


def name(names):
    def logs(f):
        def fn(*args):
            print("{}".format(names), "and", f.__name__)
            return f(*args)

        return fn

    return logs


a = name("123")
sum = a(sum)
print(sum(1, 2))

@name("123")
def add(c, z):
    return c + z

print(add(5, 6))
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值