初识 python 装饰器

1.什么是装饰器?

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

python装饰器有3类:

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

2.闭包

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

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

3.和java 注解区别

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

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

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

4.函数装饰器

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

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.带有参数的装饰器

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

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

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

6.装饰器类

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

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

说明:

  1. 类装饰器使用__init__()方法接受被装饰的类,使用__call__()返回一个新的类
  2. 在实例化被装饰的类之前和之后执行动态代码
  3. 使用@DecoratorClass  将装饰器应用于类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CAN - 基础

CAN 基础 概念分类特点物理层收发器线与编码方式通信方式采样点/位 常见故障 数据链路层CAN控制器数据帧分类数据帧格式数据帧DBC解析CRC校验远程帧 总线竞争与仲裁非破坏性仲裁机制 节点状态与错误处理机制节点状态错误处理机制错误帧 概念 分类 CANCAN FD高速CAN低俗容错CA…

Spring Boot 自动注入失败的原因

问题 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type com.sveinn.chatbotdomain.zsxq.service.ZsxqApi available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {ja…

QtCreator配置代码字体和颜色

文件路径 默认配色方案 This XML file does not appear to have any style information associated with it. The document tree is shown below. <style-scheme version"1.0" name"Default"> <style name"Text" foreground"#000…

Matlab信号处理:FFT频谱分辨率

频谱分辨率&#xff1a; 其中为采样间隔&#xff0c;为采样点数。 FFT分辨率&#xff1a; 其中为采样频率&#xff0c;为FFT点数。 有两正弦函数&#xff0c;频率分别为 f1 1Hz&#xff0c;f2 10Hz&#xff0c;f3 40Hz&#xff1b; 示例1&#xff1a; 采样频率 fs 1000H…

MySQL进阶篇3-视图和存储过程以及触发器的学习使用

视图/存储过程&#xff08;函数&#xff09;/触发器 视图&#xff1a;由表动态生成&#xff0c;虚拟的表&#xff0c;保存的是sql的逻辑。 创建视图&#xff1a; ​ create [or replace] view viewName【列名列表】 as select 语句 [with [cascaded|local] check option] 修…

国外发达国家码农是真混得好么?

来看看花旗工作十多年的码农怎么说吧! 美国最大的论坛 Reddit&#xff0c;之前有一个热帖&#xff1a; 一个程序员说自己喝醉了&#xff0c;软件工程师已经当了10年&#xff0c;心里有 好多话想说&#xff0c;“我可能会后悔今天说了这些话。”他洋洋洒洒写了 一大堆&#xff…

【Node.js】数据库配置与操作、Session实现原理、JWT实现原理:

文章目录 一、数据库配置与操作【1】 数据库的基本操作【2】 使用 mysql 模块操作 MySQL 数据库 二、Session实现原理【1】HTTP 协议的无状态性【2】Cookie【3】Session 的工作原理【3】在 Express 中使用 Session 认证 三、JWT实现原理【1】JWT 的工作原理【2】JWT 的组成部分…

Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现

Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现 文章目录 1\. 伙伴系统的核心数据结构2\. 到底什么是伙伴3\. 伙伴系统的内存分配原理4\. 伙伴系统的内存回收原理5\. 进入伙伴系统的前奏5.1 获取内存区域 zone 里指定的内存水位线5.2 检查 zone 中剩余内存容量…

powerDesigner 的基本使用

打开powerDesigner 新建 PDM(物理数据模型) 添加表字段 双击表&#xff0c;设置ID自增 选择导出数据库表SQL 导出成功 使用三方工具连接数据库&#xff0c;然后运行对应SQL文件即可 导入SQL文件数据到powerDesigner

如何用Postman做接口自动化测试

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完…

Kafka 集群与可靠性

文章目录 Kafka集群的目标Kafka集群规模如何预估Kafka集群搭建实战Kafka集群原理成员关系与控制器集群工作机制replication-factor参数auto.leader.rebalance.enable参数 集群消息生产可靠的生产者ISR&#xff08;In-sync Replicas&#xff09;使用ISR方案的原因ISR相关配置说明…

python pycharm 下载 安装 自(1)

pycharm 官网 JetBrains: 软件开发者和团队的必备工具 python 官网 Python Release Python 3.11.5 | Python.org 软件安装 因为python需要借助pycharm所以需要安装 下边截图是重要的部分 pycharm python 终端安装 然后进行全局配置 打开pycahrm 可以在扩展里边搜索中…

docker安装es docker安装Elasticsearch windows linux

下载Elasticsearch和Kibana镜像docker pull elastic/elasticsearch:8.8.2 docker pull elastic/kibana:8.8.2 2. 设置max_map_countwindows&#xff1a; wsl -d docker-desktop sysctl -w vm.max_map_count262144 exit linux&#xff1a;cat /proc/sys/vm/max_map_count sys…

51单片机项目(13)——基于51单片机的智能台灯protues仿真

本次设计&#xff0c;使用protues软件进行仿真&#xff0c;详情如下&#xff1a; 1.输入部分:由热释电红外传感器、光敏传感器、超声波测距传感器所构成的子电路组成。 2.输出模块:由1602液晶显示及其蜂鸣器报警系统组成。 3.中央处理器:主要有AT89C52单片机构成。 4.工作过…

【Linux】进程控制

目录 一、进程创建初识fork函数fork函数返回值写时拷贝fork常规用法fork调用失败的原因 二、进程终止进程退出场景进程常见退出方法_exit函数与exit函数 三、进程等待进程等待必要性进程等待的方法waitwaitpid 获取子进程status非阻塞等待测试 四、进程程序替换替换原理替换函数…

Python WEB框架FastAPI (二)

Python WEB框架FastAPI &#xff08;二&#xff09; 最近一直在使用fastapi&#xff0c;随着使用的深入发现我对于它的了解还是太少了&#xff0c;以至于踩了一些坑。所以在这里记录一下&#xff0c;愿看到的小伙伴不迷路。 路径传参并发问题 一、路径传参 这是对上一个传参…

数字化管理新革命,AI数字人CEO登场引领变革!

王一博老板乐华娱乐CEO杜华推出了她的双生数字人华华子&#xff0c;专门替自己直播卖货。在没有任何宣传的情况下&#xff0c;仅仅在短短的10分钟直播时间内&#xff0c;观众人数就飙升至30万人&#xff01;同时&#xff0c;“杜华AI华华子直播”更是迅速登上了微博热搜榜。这一…

【Mysql】数据库第四讲(表的增删改查操作 超全面 附实操案例)

表的查询 1.Create 表的创建1.1单行插入多行插入1.2替换 2.Retrieve 读取2.1全列查询2.2指定列查询2.3查询字段为表达式2.4为查询结果指定别名2.5结果去重2.6WHERE条件2.7结果排序2.8筛选分页结果 3.Update更新案例 4.Delete删除案例截断表插入查询结果 5.聚合函数 1.Create 表…

Intellij idea 2023 年下载、安装教程、亲测可用

文章目录 1 下载与安装IDEA2 常用设置设置 Java JDK 版本自动导入包、移除包IDEA 自动生成 author 注释签名java.io.File 类无法自动提示导入&#xff1f;高亮显示与选中字符串相同的内容IDEA 配置 MavenIDEA 连接 Mysql 数据库 3 参考文章 1 下载与安装IDEA 首先先到官网下载…

centos设置固定ip

ip addr查看是哪张网卡我这里是 编辑 设置