Python编程 装饰器

简介: Python编程 装饰器

前言

本章将会讲解Python编程中的装饰器。


一.函数

1.装饰器引入


545561475bab47d892b7b098bb786920.png

思考:

  • 计算 test1 运行的时间
  • 计算 test2 运行的时间
  • 计算 test3 运行的时间
  • 计算 test4 运行的时间

(1)时间模块

time模块提供各种操作时间的函数


说明:一般有两种表示时间的方式:


第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的

第二种以数组的形式表示即(struct_time),共有九个元素,分别表示,同一个时间戳的struct_time会因为时区不同而不同


import time  # python内置模块,时间模块

封装函数(calcu_time)

# 计算时间得函数
def calcu_time(func):
    start = time.time()
    func()
    end = time.time()
    print(f"spend {end - start}")


# 计算时间得函数
def calcu_time(func):
    start = time.time()
    func()
    end = time.time()
    print(f"spend {end - start}")
def test1():
    print("--test1--")
    time.sleep(2)
def test2():
    print("--test2--")
    time.sleep(2)
calcu_time(test1)
calcu_time(test2)
"""
就是在不改变函数源代码得情况下为函数添加新得功能
"""

2.装饰器介绍

装饰器(Decorator)是Python中一个重要部分,它本质上是一个函数,不同于普通函数,装饰器的返回值是一个函数对象。通过利用装饰器,我们可以让其他函数在不做任何代码改动的情况下增加额外的功能,同时也能够让代码更加简洁。

bf46789509f94a4287851d904ac67543.png

# 需要给各个函数添加上打印hello world得功能
def print_hw(f):
    print("hello world")
    return f
@print_hw           # @装饰器函数名称     test2 = print_hw(test)
def test():
    sum_li = sum([12, 3, 4])
    print(sum_li)
    return sum_li
@print_hw
def test2():
    print("我是网络豆")
# test2 = print_hw(test)  # test函数引用作为实参 test2 = f = test
# test2()     # test2() = f() = test()
test()
test2()
"""
注意:
1. test()函数未调用得时候,装饰器就已经执行
"""

3.使用装饰器优化


import time
"""
此处是问题代码,因为重复调用了test1()
"""
 # 计算时间得函数
def calcu_time(func):    # func = test1
     start = time.time()
     func()      # test1()
     end = time.time()
     print(f"spend {end - start}")
     return func
 def test1():
     print("--test1--")
     time.sleep(2)
 test = calcu_time(test1)    # test = func = test1
 test()
# 计算时间得函数
def calcu_time(func):
    def test_in():               # 1.外函数里面有内函数
        start = time.time()
        func()      # test1()    # 2.内函数引用了外函数得临时变量
        end = time.time()
        print(f"spend {end - start}")
    return test_in               # 3.内函数的引用作为外函数的返回值
@calcu_time             # test = calcu_time(test1)
def test1():
    print("--test1--")
    time.sleep(2)
@calcu_time
def test2():
    print("--test2--")
    time.sleep(2)
 test = calcu_time(test1)    # test = test_in
 test()     # test_in()
 test = calcu_time(test2)    # test = test_in
 test()     # test_in()
test1()
"""
此处,形成闭包的现象。
1.嵌套函数
2.内层函数引用外层函数变量-->函数名本质也是变量
3.内函数的引用作为外层函数的返回值
"""
目录
相关文章
|
1天前
|
Java UED Python
Python多线程编程实战技巧与性能优化策略
Python多线程编程实战技巧与性能优化策略
|
2天前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
8 0
|
4天前
|
设计模式 程序员 测试技术
老程序员分享:Python数据模型及Pythonic编程
老程序员分享:Python数据模型及Pythonic编程
16 1
|
6天前
|
索引 Python 容器
Python数据类型:编程新手的必修课
Python数据类型:编程新手的必修课
|
6天前
|
Python
Python深入讲解系列之装饰器
Python深入讲解系列之装饰器
10 1
|
6天前
|
缓存 测试技术 Python
Python的装饰器详细讲解
Python的装饰器详细讲解
|
6天前
|
算法 Java 程序员
Python面相对象的编程
Python面相对象的编程
|
6天前
|
Python
揭秘Python安装目录:你的编程宝库隐藏了哪些宝藏?
揭秘Python安装目录:你的编程宝库隐藏了哪些宝藏?
|
6天前
|
开发者 Python
Python进阶:深入剖析闭包与装饰器的应用与技巧
Python进阶:深入剖析闭包与装饰器的应用与技巧
|
6天前
|
数据挖掘 数据处理 Python
Python编程入门:从基础到实践
【6月更文挑战第26天】这篇文章引导读者逐步学习Python编程,从基础语法如变量、数据类型(整数、浮点数、字符串)到条件语句、循环(if/for/while),再到函数定义和模块导入。通过实例展示了Python在文本处理、数据分析(使用pandas)和Web开发(使用Flask)的应用。学习Python能为初学者开启更广阔的技术领域,如面向对象编程、并发和网络编程等。