Python装饰器

Python装饰器

​ 首先提出一个问题,可以把一个函数作为另一个函数的参数传递过去嘛?答案是可以的

​ 如下图所示:

#能不能把函数作为参数传递给另一个函数呢?

def myfunction():

    print("myfunction函数正在执行......")

def myfunction1(func):    #把函数作为一种参数传递给下一个函数中

    print("myfunction1函数正在调用中....")

    func()       #调用函数

    print("调用完成......")


#调用函数
myfunction1(myfunction)

#结果:
myfunction1函数正在调用中....
myfunction函数正在执行......
调用完成......


接下来我们创建一个比较复杂的函数,来计算一个函数在调用的时候经历了多长时间:

#来计算一个函数在调用的时候经历了多长时间
def timecontrol(func):
    print("-------------")
    time_time1 = time.time()
    func()
    time_time2 = time.time()

    time_ = time_time2 - time_time1
    print("--------------")
    print("时间经历:",time_)

def myfunction2():
     time.sleep(2)
     print("myfunction2函数已经进行调用...")

timecontrol(myfunction2)

​ 上面调用函数的过程中,我们的效率并不是很高的,那么有没有更好的提高效率的方法呢?有的,装饰器

我们把上面的那段代码,借用装饰器来改变一下,如下代码所示:

def timecontrol1(func):
    def control():
        print("-------------")
        time_time1 = time.time()
        func()
        time_time2 = time.time()

        time_ = time_time2 - time_time1
        print("--------------")
        print("时间经历:", time_)
    return control

@timecontrol1     #语法糖
def myfunction3():
    time.sleep(2)
    print("myfunction2函数已经进行调用...")

myfunction3()

其中@timecontrol1是一个语法糖,分析上面的代码,我们并没有显示的调用函数timecontrol(myfunction3),但是的确调用了这个函数,这便是装饰器的魅力。

​ 介绍一下装饰器的意义,在实际开发中我们经常会遇到各种各样的需求,因而发明了装饰器,有了装饰器就可以不直接去修改代码,只用在需要调用函数的上方加上@timecontrol1就直接可以调用了。

​ 装饰器的原理就是:1.闭包,2.拿函数当参数。装饰器的底层原理代码是这样的;

def control1(func):
    def control():
        print("-------------")
        time_time1 = time.time()
        func()
        time_time2 = time.time()

        time_ = time_time2 - time_time1
        print("--------------")
        print("时间经历:", time_)
    return control


def myfunction4():
    time.sleep(2)
    print("myfunction4函数已经进行调用...")

myfunction4 = control1(myfunction4())

我们可以理解成语法糖的作用就是对原生代码的简单封装

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值