首先我们知道python函数内部还可以定义函数,并返回该函数:
def HelloWorld():
print("Hello World!!!")
def HelloChina():
print("Hello China!!!")
return HelloChina
HelloChina=HelloWorld()
HelloChina()
输出:
Hello World!!!
Hello China!!!
那么装饰器作用是:装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
比如我们定一个NameWrite函数,
def NameWrite():
print("Xiaoming!!!")
若我们额外增加一个打印函数名的语句,那么函数会定义为:
def NameWrite():
print("Xiaoming!!!")
print("func name is "+NameWrite.__name__)
如果我们又不想改变原来函数结构,我们可以这样定义:
def NameWrite():
print("Xiaoming!!!")
def logging(func):
def logwith():
print("func name is "+func.__name__)#这个就是加的语句
return func()#这个地方就相当于运行了一遍函数,当然这个地方若func()本身没有返回值,也没有关系
return logwith
NameWrite=logging(NameWrite)
NameWrite()
运行结果:
func name is NameWrite
Xiaoming!!!
那么这里就是使用logging函数将NameWrite函数修饰了一下,logging内部定义了一个logwith函数,该函数就一句打印函数名称的语句,同时返回值是参数func的运行。NameWrite=logging(NameWrite)语句就是相当于把logwith函数从新赋给Namewrite,此时Namewrite既可以打印函数名称,同时也可以执行原来的函数体。此时我们就把logging称为装饰器。
更简单的写法是使用@符号+装饰器,在定义函数之前:
def logging(func):
def logwith():
print("func name is "+func.__name__ )
return func()
return logwith
@logging
def NameWrite():
print("Xiaoming!!!")
NameWrite()
输出:
func name is Namewrite
Xiaoming!!!