装饰器

什么是装饰器

装饰器可以给现有的模块增加一些新的功能,同时,不需要对原模块做出任何修改。
装饰器的使用符合了面向对象编程的开放封闭原则。

开放封闭原则主要体现在两个方面:

  1. 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
  2. 对修改封闭,意味着修改时不应修改代码来实现变化。

装饰器的实现

首先,我们要知道,在Python中,函数也可以作为参数传递:

def run(func):
    print('in run function')
    func()

def function():
    print('hello world')

run(function)

"""
in run function
hello world
"""

知道这一点后,我们就可以写一个专门用来记录函数运行时间的函数。

from time import time, sleep
def count_time(func):
    print('start')
    start = time()
    func()
    end = time()
    print('time: ', str(end - start) + 's')

def function():
    print('hello world')
    sleep(2)
    print('good bye world')

count_time(function)

"""
start
hello world
good bye world
time:  2.0017452239990234s
"""

换一种写法:

from time import time, sleep
def count_time(func):
    def wrapper():
        print('start')
        start = time()
        func()
        end = time()
        print('time: ', str(end - start) + 's')
    return wrapper

def function():
    print('hello world')
    sleep(2)
    print('good bye world')

new_function = count_time(function)
new_function()

"""
start
hello world
good bye world
time:  2.0072693824768066s
"""

使用语法糖,也就是装饰器

from time import time, sleep
def count_time(func):
    def wrapper():
        print('start')
        start = time()
        func()
        end = time()
        print('time: ', str(end - start) + 's')
    return wrapper

@count_time
def function():
    print('hello world')
    sleep(2)
    print('good bye world')

function()

"""
start
hello world
good bye world
time:  2.004805564880371s
"""
posted @ 2024-05-14 23:11  何太狼  阅读(5)  评论(0编辑  收藏  举报