python 之装饰器 演变过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xqt15538076006/article/details/82219349

需求如下
项目中定义了两个函数foo和bar 这是公共函数。现在需要在调取这两个函数的基础上 计算函数执行的时间。(原则不修改foo和bar函数)

演变一:

这种方式是直接在原函数的内部修改源代码 太过于简单 就不写了。这种方式缺点太多,涉及到直接修改函数源码了。方式不可取。

演变二

import time


def foo():
    time.sleep(1)
    print('foo......')


def bar():
    time.sleep(1)
    print('bar......')


def show_time(f):
    start_time = time.time()
    f()
    end_time = time.time()
    print('spend time %s'%(end_time - start_time))


show_time(bar)

结论 :如果想要调取foo 那就直接调取show_time(foo) 如果想要调取bar 直接show_time(bar) 即可。但是目前的缺陷是:本来是调取foo 现在变成调取show_time 改变了调取的方式。虽然实现了功能但是改变函数名是不可取的。

演变三

import time


def foo():
    time.sleep(1)
    print('foo......')


def bar():
    time.sleep(1)
    print('bar......')


def show_time(f):
    def inner():
        start_time = time.time()
        f()
        end_time = time.time()
        print('spend time %s'%(end_time - start_time))
    return inner


foo = show_time(foo)
bar = show_time(bar)
foo()
bar()

结论:功能基本上已经实现 但是这种写法 不好看,每一个函数都需要进行赋值。

演变四

import time


def show_time(f):
    def inner():
        start_time = time.time()
        f()
        end_time = time.time()
        print('spend time %s'%(end_time - start_time))
    return inner


@show_time  # foo = show_time(foo)
def foo():
    time.sleep(1)
    print('foo......')


@show_time  # bar = show_time(bar)
def bar():
    time.sleep(1)
    print('bar......')


foo()
bar()

结论:这就是最终的方式

猜你喜欢

转载自blog.csdn.net/xqt15538076006/article/details/82219349
今日推荐