python函数装饰器

首先我们知道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!!!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值