装饰器相关

Posted simonsun002

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关相关的知识,希望对你有一定的参考价值。

高阶函数的两种情况:

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)

  

以上是关于装饰器相关的主要内容,如果未能解决你的问题,请参考以下文章

类中的装饰器在Pycharm中抛出警告

装饰器相关

装饰器181029

Python面向对象学习之八,装饰器

TypeScript装饰器

装饰器相关