》功能

为一个函数提供一些额外的功能

》两个原则

1,不修改被装饰的函数

2,不修改调用方式

》分步推演

函数一是装饰函数

函数二是功能函数

》一,先实现基本功能

》1,原始的功能

import time

# 装饰器函数
def cont_time(func):
    """统计时间的装饰器"""
    start_time = time.time()
    func()
    end_time = time.time()


# 功能函数
def do_work():
    """有耗时的函数"""
    print('do_work开始')
    time.sleep(3)
    print('do_work结束')


do_work()

运行结果

C:\Users\python_hui\Anaconda3\python.exe G:/test/a/1.py
do_work开始
do_work结束

Process finished with exit code 0

》2,装饰器生效

import time

# 装饰器函数
def cont_time(func):
    """统计时间的装饰器"""
    start_time = time.time()
    print('计时开始。。。')
    func()
    end_time = time.time()
    print('计时结束,总共耗时{:.2f}秒'.format(end_time - start_time))


# 功能函数
def do_work():
    """有耗时的函数"""
    print('do_work开始')
    time.sleep(3)
    print('do_work结束')


cont_time(do_work)

结果

C:\Users\python_hui\Anaconda3\python.exe G:/test/a/1.py
计时开始。。。
do_work开始
do_work结束
计时结束,总共耗时3.01秒

Process finished with exit code 0

== 1,完成,不修改被装饰的函数 ==

==2,未完成,不修改调用方式 ==

》二,基本功能完成,优化调用方式

基本功能完成

调用方式发生变化

修改调用方式

import time

# 装饰器函数
def cont_time(func):
    """统计时间的装饰器"""
    def inner():
        start_time = time.time()
        print('计时开始。。。')
        func()
        end_time = time.time()
        print('计时结束,总共耗时{:.2f}秒'.format(end_time - start_time))
    return inner

# 功能函数
def do_work():
    """有耗时的函数"""
    print('do_work开始')
    time.sleep(3)
    print('do_work结束')


do_work = cont_time(do_work)     # do_work = inner
do_work()    # inner()


结果

C:\Users\python_hui\Anaconda3\python.exe G:/test/a/1.py
计时开始。。。
do_work开始
do_work结束
计时结束,总共耗时3.01秒

Process finished with exit code 0

== 1,完成,不修改被装饰的函数 ==

==2,完成,不修改调用方式 ==

但是,每一次用前都需要有一个重新赋值的的操作,麻烦

》三,语法堂优化

通过语法堂来解决上一步问题

import time

# 装饰器函数
def cont_time(func):
    """统计时间的装饰器"""
    def inner():
        start_time = time.time()
        print('计时开始。。。')
        func()
        end_time = time.time()
        print('计时结束,总共耗时{:.2f}秒'.format(end_time - start_time))
    return inner

# 功能函数
@cont_time  # 相当于 do_work = cont_time(do_word)
def do_work():
    """有耗时的函数"""
    print('do_work开始')
    time.sleep(3)
    print('do_work结束')


do_work()

结果

C:\Users\python_hui\Anaconda3\python.exe G:/test/a/1.py
计时开始。。。
do_work开始
do_work结束
计时结束,总共耗时3.00秒

Process finished with exit code 0

基本装饰器到此完成

》随堂

import time

# 装饰器函数
def cont_time(func):
    """统计时间的装饰器"""
    def inner():
        start_time = time.time()
        print('计时开始。。。')
        func()
        end_time = time.time()
        print('计时结束,总共耗时{:.2f}秒'.format(end_time - start_time))
    return inner

# 功能函数
@cont_time  #do_work = count_time(do_work)  --->  do_work = inner
def do_work():
    """有耗时的函数"""
    print('do_work开始')
    time.sleep(3)
    print('do_work结束')


@cont_time   # do_work2 = cont_time(do_work2)
def do_work2():
    print('do_work2开始')
    time.sleep(2)
    print('do_work2结束')


do_work()   # inner()
do_work2()

python-基本装饰器_赋值