python开发函数:装饰器的诞生

Posted 小小大头鬼

tags:

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

计算函数的运行时间

import time
def bar():
    print("in the bar")
    time.sleep(2)
def foo(func):
    start_time=time.time()
    func()
    end_time=time.time()
    print("in the foo")
    print("该函数运行的时间是%s"%(end_time-start_time))
foo(bar)

虽然已经实现功能,但是改变了函数bar的调用方式,优化后如下:

import time
def bar():
    print("in the bar")
    time.sleep(2)
def foo(func):
    start_time=time.time()
    print("in the foo")
    return func
    end_time=time.time()
    print("该函数运行的时间是%s"%(end_time-start_time))
bar=foo(bar)
bar()
-------------输出------------------
in the foo
in the bar

总结:函数bar的调用方式未改变,但是与题目要求又不一致,函数遇到return后结束了,未输出运行函数的时间,继续优化:

import time
def foo(func):
    def inner():
        start_time=time.time()
        print("in the foo")
        func()
        end_time=time.time()
        print("该函数运行的时间是%s"%(end_time-start_time))
    return inner
@foo#bar=foo(bar)=inner
def bar():
    print("in the bar")
    time.sleep(2)
bar()
-------------输出------------------
in the foo
in the bar
该函数运行的时间是2.0122246742248535

总结:此时装饰器的雏形已形成,那如果函数带参数的话,会是怎么样了,继续搞。

import time
def foo(func):
    print("in the foo")
    def inner(*args,**kwargs):
        start_time=time.time()
        print("in the inner")
        func(*args,**kwargs)
        end_time=time.time()
        print("该函数运行的时间是%s"%(end_time-start_time))
    return inner
@foo #bar=foo(bar)=inner
def bar(x,y):
    a=x+y
    print("in the bar")
    print("两数相加和为%s"%a)
    time.sleep(2)
bar(3,5)
-------------输出------------------
in the foo #无论函数是否运行,都会默认执行这一步
in the inner
in the bar
两数相加和为8
该函数运行的时间是2.0000240802764893

总结:无论函数是否执行,都会默认先执行foo函数的,就是这么给力,那如果函数还有返回值了,怎么弄了

import time
def foo(func):
    print("in the foo")
    def inner(*args,**kwargs):
        start_time=time.time()
        print("in the inner")
        res=func(*args,**kwargs)
        print("函数的返回值为:%s"%res)
        end_time=time.time()
        print("该函数运行的时间是%s"%(end_time-start_time))
    return inner
@foo #bar=foo(bar)=inner
def bar(x,y):
    a=x+y
    print("in the bar")
    time.sleep(2)
    return a
bar(3,5)
-------------输出------------------
in the foo
in the inner
in the bar
函数的返回值为:8
该函数运行的时间是2.000295639038086

总结:只是稍加变动就搞定了,那如果装饰器也带参数,实现只有在特定情况下计算函数运行的时间,否则不执行

import time
def foo(auth_type):
    print("in the foo")
    def outer(func):
        print("in the outer")
        def inner(*args,**kwargs):
            if auth_type=="run":
                start_time=time.time()
                print("in the inner")
                res=func(*args,**kwargs)
                print("函数的返回值为:%s"%res)
                end_time=time.time()
                print("该函数运行的时间是%s"%(end_time-start_time))
            else:
                print("输入的auth_type不是run")
        return inner
    return outer
@foo("run") #1、outer=foo("run"),2、bar=outer(bar)=inner
def bar(x,y):
    a=x+y
    print("in the bar")
    time.sleep(2)
    return a
bar(3,5)
-------------输出------------------
in the foo#只要加了装饰器,会默认输出
in the outer#只要加了装饰器,会默认输出
in the inner
in the bar
函数的返回值为:8
该函数运行的时间是2.0101609230041504

总结:完美搞定,加了装饰器的效果后,会首先运行foo("run")得到outer,然后把函数bar当作参数传入给outer得到outer(bar)运行后得到inner。

以上是关于python开发函数:装饰器的诞生的主要内容,如果未能解决你的问题,请参考以下文章

python开发装饰器的应用

Python进阶装饰器(Decorator)

python 装饰器的使用

python装饰器的使用

Python学习---装饰器的学习1210

Python装饰器的实现和万能装饰器