初识 python 装饰器

1. 什么是装饰器?

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

python装饰器有3类:

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

2.闭包

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

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

3.和java 注解区别

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

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

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

4.函数装饰器

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

python 复制代码
def decorator_func(func):
    def wrapper():
        print("函数执行前操作")
        func()
        print("函数执行后操作")
    return wrapper
@decorator_func
def test_func():
    print("******我是执行函数,我做了很多逻辑处理!******")
if __name__ == '__main__':
    test_func()

说明:

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

5. 带有参数的装饰器

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

python 复制代码
def decorator_agrs(name, age):
    def decorator_func(func):
        def wrapper(*agrs, **agrs2):
            print("姓名:", name, "年龄:", age)
            func(*agrs, **agrs2)
            print("函数执行后,年龄太大了")
        return wrapper
    return decorator_func
@decorator_agrs("吴刚", 19)
def test_func(name):
    print("我的名字是:", name)
if __name__ == '__main__':
    test_func("嫦娥")

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

6. 装饰器类

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

python 复制代码
class DecoratorClass:
    def __init__(self, cls):
        self.cls = cls
    def __call__(self, *args, **kwargs):
        print("出门打扮:", args[0])
        obj = self.cls(*args, **kwargs)
        print("回家休息")
        return obj
@DecoratorClass
class TestClass:
    def __init__(self, name):
        self.name = name
    def shopping(self):
        print(f"Hello, {self.name}!")
if __name__ == '__main__':
    obj = TestClass("嫦娥")
    obj.shopping()

说明:

  1. 类装饰器使用__init__()方法接受被装饰的类,使用__call__()返回一个新的类
  2. 在实例化被装饰的类之前和之后执行动态代码
  3. 使用@DecoratorClass 将装饰器应用于类。
相关推荐
Chef_Chen3 分钟前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
百事老饼干7 分钟前
Java[面试题]-真实面试
java·开发语言·面试
千澜空23 分钟前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩30 分钟前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
杨荧1 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰1 小时前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
yannan201903131 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁1 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev1 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习