• 【python】(二十) python装饰器



    1. 函数引用

    • 函数可以被引用
    • 函数可以被赋值给一个变量
    def hogwarts():
        print("hogwarts")
    
    harry = hogwarts  #将hogwarts赋值给harry变量
    harry()  # <==> hogwarts()
    
    """
    hogwarts:没有括号是函数对象
    hogwarts():有括号是函数调用
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2. 闭包函数

    闭包函数:函数里面套函数这种形式的函数,一般就是闭包函数

    闭包函数示例:

    #闭包函数
    def output_student(grade):
        def inner(name, gender):
            print(f"霍格沃兹开学啦!学生的名称是{name},性别是{gender},年级是{grade}")
        return inner # 调用output_stundent后,inner函数对象会被返回
    
    student = output_student(1)  #相当于对student进行了inner函数对象的赋值操作
    student("罗恩", "男") #对inner进行调用,传inner函数需要的参数
    student("哈利", "男")
    student("赫敏", "女")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    闭包函数特性:

    • 闭包的内部函数中,对外部作用域的变量进行引用
    • 闭包无法修改外部函数的局部变量
    • 闭包可以保存当前的运行环境

    3. python装饰器

    3.1 为什么要学习装饰器

    • 行业需求: 涉及 Python 技术栈,面试常见题
    • 使用需求: 优化代码的可读性,可维护性

    3.2 装饰器示例

    函数体开始执行与结束执行的时候分别添加打印信息。

    1. 以下不使用装饰器的代码,可读性比较差,也不容易理解,且使用起来不灵活。
    # 不使用装饰器的代码
    def timer(func):
        print("计时开始")
        func()
        print("计时结束")
    
    def hogwarts():
        print("霍格沃兹")
    
    timer(hogwarts)
    #可读性比较差
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 使用装饰器代码,可读性增加,使用也比较灵活。
    # 使用装饰器的代码
    def timer(func):
        def inner():
            print("计时开始")
            func()
            print("计时结束")
        return inner
    
    @timer
    def hogwarts():
        print("霍格沃兹")
    
    hogwarts()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.4 装饰带参数函数

    实现一个计时器的装饰器,计算函数的执行时间

    import datetime
    #装饰器函数
    def timer(func):
        #使用不定长参数,这样可以在未确定被装饰函数的参数数量时,避免出现报错。
        def inner(*args, **kwargs):
            # 获取当前时间
            start_time = datetime.datetime.now()
            func(*args, **kwargs)
            end_time = datetime.datetime.now()
            print(f"函数的执行时间{end_time-start_time}")
        return inner  #将inner函数对象return出去
    
    #被装饰函数
    @timer
    def hogwarts(name):
        print("霍格沃兹", name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    MySQL 8.0 Clone 备份恢复演练
    Android Framework系列---输入法服务
    Elasticsearch使用篇 - 关联查询
    Go中赋值和转换关系
    双向电平电压转换器TXS0102DCTR应用电路设计
    【无标题】
    大一新生HTML期末作业,网页制作作业——明星介绍易烊千玺网站HTML+CSS
    IOC+AOP已经被面试被问烂了,还搞不明白?
    clickhouse笔记04--快速理解分片和副本
    day16-Servlet05
  • 原文地址:https://blog.csdn.net/gjj920318/article/details/126972081