python 之装饰器 演变过程

项目中有公共函数foo和bar,需求是在不修改其源码的基础上计算函数执行时间。文中依次介绍了四种实现方式,前三种各有缺陷,如修改源码、改变调用方式、写法繁琐等,最终得出了较为理想的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求如下
项目中定义了两个函数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()

结论:这就是最终的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值