• 【python随笔】-深入理解装饰器


    0x00 - 前言

    装饰器实际上是一种设计模式,它的功能是给某个函数加一些功能,而不会动到原来已经写好的代码(是不是听起来像是遵循开闭原则)。

    0x01 - 装饰器写法

    比较完备的装饰器写法是这样的:

    def decorate_line(func):
        def inner(*args, **kwargs):
            print('-----------------')
            return func(*args, **kwargs)
        return inner
    
    def decorate_star(func):
        def inner(*args, **kwargs):
            print('******************')
            return func(*args, **kwargs)
        return inner
    
    @decorate_line
    @decorate_star
    def print_name():
        print('vth')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这其实是运用了python的语法糖。

    @decorate_line
    
    • 1

    这个就相当于以下代码:

    print_name = decorate_line(print_name)
    
    • 1

    这个语法糖就是干了这个事儿。

    一定要记住, @后面跟的是一个装饰器,而不是装饰器的调用。
    讲到这里,你也许会迷惑,装饰器到底是什么?
    我认为比较好的定义是这样的:装饰器返回了一个闭包(啥是闭包?闭包是能够访问其他函数内部变量的函数)。调用这个闭包,会执行你想进行装饰的操作和你要装饰的函数。

    0x02 - 装饰器进阶

    在0x01中我们给出的代码,装饰器代码严重重复。我们发现可以用参数化的方式来实现代码重用。但由于语法糖的存在,我们无法给装饰器传递参数(语法糖默认将被装饰的函数当作唯一的参数传递给装饰器).
    但记住,我们特别强调过, @后面跟的是一个装饰器,所以,我们可以通过闭包的特点来使装饰器能够访问参数。

    def get_decorate_shape(shape):
        def real_decorate(func):
            def inner(*args, **kwargs):
                print(shape * 30)
                return func(*args, **kwargs)
            return inner
        return real_decorate
    
    @get_decorate_shape('*')
    def print_name():
        print('vth')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    get_decorate_shape('*') 这一行其实是一个函数执行,它拿到了一个闭包,这个闭包就是我们要的装饰器。

    闭包牛逼!!

  • 相关阅读:
    深度学习笔记---学习预备知识
    MAC OS使用docker部署RocketMQ,解决宿主机无法访问broker
    【数据结构】图的存储结构(邻接矩阵)
    C语言文件操作——数据文件类型、文件判断、文件缓冲区详解
    内存、指针与数组
    ChatGpt3.5已经应用了一段时间,分享一些自己的使用心得.
    四旋翼无人机学习第8节--OpenMV电路分析
    机器学习笔记 - 使用机器学习进行鸟类物种分类
    Spring笔记(四)(黑马)(web层解决方案-SpringMVC)
    数据元素介绍
  • 原文地址:https://blog.csdn.net/weixin_41687289/article/details/126266941