码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器相关

时间:2018-04-08 22:28:25      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:函数嵌套   star   代码   修改   理解   效果   python   函数   time()   

高阶函数的两种情况:

1、

把一个函数名当成实参传给另外一个函数(在不修改被装饰函数源代码的情况下,为其添加功能)

import time


def bar():
    time.sleep(2)
    print(‘in the bar‘)


def test1(fun_name):
    t1 = time.time()
    fun_name()
    print(‘run time:%s‘%(time.time()-t1))


test1(bar)

2、

返回值中包含函数名(不修改调用方式)

import time


def bar():
    time.sleep(2)
    print(‘in the bar‘)


def test1(fun_name):
    return  fun_name


bar = test1(bar)

bar()

高阶函数+嵌套函数则得到装饰器

import time


def timer(fun_name):
    def deco():
        start_time = time.time()
        fun_name()
        end_time = time.time()
        print(‘running time:%s‘ % (end_time - start_time))

    return deco


def bar():
    time.sleep(2)
    print(‘in the bar‘)


bar = timer(bar)
bar()

但我们一般把装饰器在被装饰函数前面定义,并且用如下的写法代替:

import time


def timer(fun_name):
    def deco():
        start_time = time.time()
        fun_name()  # 在这里调用是bar()这个函数
        end_time = time.time()
        print(‘running time:%s‘ % (end_time - start_time))

    return deco


@timer  # bar = timer(bar) 这步其实是调用了timer()这个函数,把bar这个函数进行重新定义
def bar():
    time.sleep(2)
    print(‘in the bar‘)


bar()  # 在调用bar的时候,其实调用的是deco()这个函数

  

可以理解为,先用第一种高阶函数加上想要的功能,再重新覆盖定义这个函数,再用函数嵌套,就得到了我们想要的装饰器的效果

如果有参数:

import time


def timer(fun_name):
    def deco(*args,**kwargs):
        start_time = time.time()
        fun_name(*args,**kwargs)
        end_time = time.time()
        print(‘running time:%s‘ % (end_time - start_time))

    return deco


@timer  # bar = timer(bar)
def bar():
    time.sleep(2)
    print(‘in the bar‘)


@timer
def bar2(name,age):
    print(name,age)


bar()
bar2(‘simon‘,22)

  

装饰器相关

标签:函数嵌套   star   代码   修改   理解   效果   python   函数   time()   

原文地址:https://www.cnblogs.com/Simonsun002/p/8747473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!