• 初识 python 装饰器


    1.什么是装饰器?

    装饰器(Decorator)是Python中一种用于修改函数或类的行为的设计模式。装饰器允许您在不修改原始函数或类的情况下,给它们添加新的功能,这使得代码更具可重用性和可扩展性。简而言之,就是一个返回函数的高阶函数,作用就是为其他函数添加附加功能,在代码运行的时候动态增加功能的方式。

    python装饰器有3类:

    1. 函数装饰器
    2. 带参数的装饰器
    3. 类装饰器

    2.闭包

    在外函数中定义一个内函数,内函数引用外函数的临时变量,并且外函数返回的是内函数的引用。这大概就是闭包的含义吧。

    我理解pyhton的decorator 本质上就是一个闭包,在不改变原有函数的代码和调用情况下,实现动态增加原有函数的功能,常常用在引用日志,函数执行时间,事务处理等场景下。

    3.和java 注解区别

    我理解python装饰器和Java AOP(切面)更像,aop依赖spring框架。

     AOP要做的三件事是:在哪里切入,什么时候切入,切入后做什么事.

    1. 在哪里切入:就是权限校验等非业务操作在哪些业务代码中执行
    2. 什么时候切入:就是业务代码执行前还是执行后
    3. 切入后做什么事:比如做权限校验,日志记录等等

    4.函数装饰器

    函数装饰器是一种用于装饰函数的装饰器。它们以被装饰的函数作为参数,并返回一个新的函数(通常是内部函数)

    1. def decorator_func(func):
    2.     def wrapper():
    3.         print("函数执行前操作")
    4.         func()
    5.         print("函数执行后操作")
    6.     return wrapper
    7. @decorator_func
    8. def test_func():
    9.     print("******我是执行函数,我做了很多逻辑处理!******")
    10. if __name__ == '__main__':
    11.     test_func()

    说明:

    1. 函数装饰器使用内部函数来包装被装饰的函数,并返回一个新的函数
    2. 装饰器可以在被装饰之前,之后执行传入的函数,这样提供了一些额外的动态功能
    3. 使用@decorator_func   来装饰函数,这样该函数就可以进行优美的执行。   

    5.带有参数的装饰器

    带有参数的装饰器,可以在定义装饰器上传递多个参数。

    1. def decorator_agrs(name, age):
    2.     def decorator_func(func):
    3.         def wrapper(*agrs, **agrs2):
    4.             print("姓名:", name, "年龄:", age)
    5.             func(*agrs, **agrs2)
    6.             print("函数执行后,年龄太大了")
    7.         return wrapper
    8.     return decorator_func
    9. @decorator_agrs("吴刚", 19)
    10. def test_func(name):
    11.     print("我的名字是:", name)
    12. if __name__ == '__main__':
    13.     test_func("嫦娥")

            这种定义了一个装饰工厂函数decorator_agrs,他接受2个参数,name和age,返回一个装饰器函数decorator_func ,然后使用装饰器函数进行使用。

    6.装饰器类

    类装饰器,字面意思就是装饰类的,可以将类作为参数,返回一个新的类。

    1. class DecoratorClass:
    2.     def __init__(self, cls):
    3.         self.cls = cls
    4.     def __call__(self, *args, **kwargs):
    5.         print("出门打扮:", args[0])
    6.         obj = self.cls(*args, **kwargs)
    7.         print("回家休息")
    8.         return obj
    9. @DecoratorClass
    10. class TestClass:
    11.     def __init__(self, name):
    12.         self.name = name
    13.     def shopping(self):
    14.         print(f"Hello, {self.name}!")
    15. if __name__ == '__main__':
    16.     obj = TestClass("嫦娥")
    17.     obj.shopping()

    说明:

    1. 类装饰器使用__init__()方法接受被装饰的类,使用__call__()返回一个新的类
    2. 在实例化被装饰的类之前和之后执行动态代码
    3. 使用@DecoratorClass  将装饰器应用于类。
  • 相关阅读:
    【PG】PostgreSQL参数详解(一)
    TorchScript C++ 自定义运算符 cpu&cuda
    跟我学企业级flutter项目:简化框架demo参考
    多线程-浅析线程安全
    arcgis--二维点、线转三维
    【Silvaco example】Temperature Ramping - Effect on Leakage
    计算机图形学入门02:线性代数基础
    ChatGPT WPS AI 一键核对两表数据差异
    2023.11.18html中如何使用input/button进行网页跳转
    liunx常见指令
  • 原文地址:https://blog.csdn.net/qiaobing1226/article/details/133020951