定义一个函数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))