python-基本装饰器
  TEZNKK3IfmPf 2023年11月14日 22 0

》功能

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

》两个原则

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-基本装饰器_python

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: javascript-字符串操作 下一篇: javascript-数组
  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   32   0   0 python开发语言
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
TEZNKK3IfmPf