如何系统的学习Python——装饰器

装饰器是 Python 中强大而灵活的功能,用于在不修改函数代码的情况下,增强或修改函数的行为。装饰器通常用于在函数执行前或执行后添加一些额外的功能。

下面是装饰器的基本概念和使用方法:

1. 函数的基本结构:

在理解装饰器之前,先了解一下 Python 函数的基本结构:

def my_function():# 函数体return result

2. 装饰器的概念:

装饰器实际上是一个函数,它接受一个函数作为参数,并返回一个新的函数。这个新的函数通常会在调用原始函数之前或之后执行一些额外的操作。

3. 装饰器的基本语法:

def my_decorator(func):def wrapper():# 在调用原始函数之前的额外操作result = func()  # 调用原始函数# 在调用原始函数之后的额外操作return resultreturn wrapper@my_decorator
def my_function():# 原始函数的实现return result

在上述例子中,@my_decorator 语法是装饰器的一种简便写法,等同于 my_function = my_decorator(my_function)

4. 装饰器的应用:

a. 记录函数执行时间:
import timedef timing_decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"{func.__name__} executed in {end_time - start_time} seconds")return resultreturn wrapper@timing_decorator
def my_function():# 原始函数的实现time.sleep(2)my_function()  # 输出: my_function executed in 2.000605821609497 seconds
b. 检查用户权限:
def check_permission_decorator(func):def wrapper(user):if user.is_admin:result = func(user)return resultelse:raise PermissionError("Insufficient permissions")return wrapper@check_permission_decorator
def sensitive_operation(user):# 原始函数的实现return "Sensitive operation completed successfully"# 测试
class User:def __init__(self, is_admin):self.is_admin = is_adminregular_user = User(is_admin=False)
admin_user = User(is_admin=True)try:print(sensitive_operation(regular_user))  # 输出: PermissionError
except PermissionError as e:print(e)print(sensitive_operation(admin_user))  # 输出: Sensitive operation completed successfully

在上述例子中,check_permission_decorator 装饰器用于检查用户是否有足够的权限执行敏感操作。

5. 内置装饰器:

a. @property 装饰器:
class Circle:def __init__(self, radius):self._radius = radius@propertydef radius(self):return self._radius@radius.setterdef radius(self, value):if value < 0:raise ValueError("Radius cannot be negative")self._radius = value# 使用 @property 装饰器,可以像访问属性一样访问方法
circle = Circle(5)
print(circle.radius)  # 输出: 5# 使用 @radius.setter 装饰器,可以像设置属性一样设置方法
circle.radius = 7
print(circle.radius)  # 输出: 7
b. @staticmethod@classmethod 装饰器:
class MathOperations:@staticmethoddef add(x, y):return x + y@classmethoddef multiply(cls, x, y):return x * y# 使用 @staticmethod 装饰器,方法不依赖于实例
result1 = MathOperations.add(3, 5)# 使用 @classmethod 装饰器,方法可以访问类的相关信息
result2 = MathOperations.multiply(3, 5)print(result1)  # 输出: 8
print(result2)  # 输出: 15

@staticmethod 用于定义静态方法,而 @classmethod 用于定义类方法。静态方法不依赖于实例,而类方法可以访问类的相关信息。

这些例子涵盖了装饰器在实际项目中的常见用法,但装饰器是一个非常灵活的概念,可以根据项目需求进行定制。

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

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

相关文章

visualization_msgs::Marker 的pose设置,map坐标系的3d box显示问题

3D框显示 3D框显示可以使用visualization_msgs::Marker::LINE_LIST或者LINE_STRIP&#xff0c;前者使用方法需要指明线的两个端点&#xff0c;后者自动连接相邻两个点。 姿态问题 网上看了一些&#xff0c;没有涉及到朝向设置&#xff0c;Pose.orientation默认构造为4个0 至…

Python环境下一维时间序列的小波尺度谱和时间平均小波谱(基于Morlet小波)

小波分析是较好的非平稳信号分析方法之一&#xff0c;它通过伸缩和平移运算对信号进行多尺度细化分析&#xff0c;能够在不同的尺度上描述信号的局部特征&#xff0c;为微弱故障特征信号的检测提供了有效的工具。小波尺度谱可看作一个有恒定相对带宽的谱图&#xff0c;能够反映…

模拟电子技术实验(一)

单选题 1.本实验实际操作步骤都有哪些&#xff1f; A. 实验箱上的电压测量、实验箱上的电位器测量、5K、1 0V方波信号测 量。 B. 实验箱上的电压测量、实验箱上的电位器测量、5K、1 0V正弦波信号测 量。 C. 实验箱上的电压测量、实验箱上的数码管测量、5K、1 0V方波信号测 量…

Java剖析 : HashMap底层存储数据的结构 | HashSet添加不重复元素底层原理

HashSet底层剖析 前言&#xff1a; 我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; ★ HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c…

LeetCode题练习与总结:搜索旋转排序数组

一、题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], n…

OpenAI:ChatGPT API 文档之 Embedding

在自然语言处理和机器学习领域&#xff0c;"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间&#xff08;embedding space&#xff09;&#xff0c;而生成的向量则称为嵌入向量&#xff08;embedding vector&#xff0…

14---DVI电路设计

视频链接 DVI硬件电路设计01_哔哩哔哩_bilibili DVI电路设计 1、DVI的简介 DVI(Digital Visual Interface)&#xff0c;即数字视频接口。它是1998年9月&#xff0c;在Intel开发者论坛上成立的&#xff0c;由Silicon Image、Intel(英特尔)、Compaq(康柏)、IBM(国际商业机器公…

时序数据库:TDengine整体架构

文章目录 [toc]一、集群与基本逻辑单元1.主要逻辑单元2.节点之间的通讯3.一个典型的消息流程 二、存储模型与数据分区、分片1.存储模型2.数据分片3.数据分区4.负载均衡 三、数据写入与复制流程1.Master Vnode 写入流程2.Slave Vnode 写入流程3.主从选择4.同步复制 四、缓存与持…

关于SpringSecurity出现Failed to evaluate expression ‘ps.hasAuthority(‘role‘)‘

1. 问题描述 在使用SpringSecurity对接口进行权限校验时&#xff0c;报错java.lang.IllegalArgumentException: Failed to evaluate expression ps.hasAuthority(role)。 2. 解决方案 2.1 查看是否添加注解 对于SpringSecurity对配置类&#xff0c;我们需要添加注解EnableGlo…

五 超级数据查看器 讲解稿 列表功能2

五 超级数据查看器 讲解稿 列表功能2 点击此处 以新页面 打开B站 播放教学视频 点此下载 百度手机助手 下载地址4 讲解稿全文&#xff1a; 大家好&#xff0c;今天我们讲解一下&#xff0c;超级数据查看器列表界面&#xff0c;分为1-2两集。这是第二集 继续讲解弹出式菜单…

Linux环境(Ubuntu)上的防火墙工具使用方法

目录 概述 1 防火墙工具&#xff08;ufw&#xff09; 1.1 安装防火墙工具&#xff1a; 1.2 操作防火墙相关命令 2 ufw操作命令的范例 2.1 打开/关闭防火墙 2.1.1 打开防火墙 2.1.2 关闭防火墙 2.1.3 查询当前防火墙状态 2.1.4 允许选择的端口访问 2.1.5 允许选择固定…

【数据结构】线性表的定义及基本操作

文章目录 前言线性表的定义线性表的基本操作基本操作其他常用操作 总结 前言 数据结构的三要素是逻辑结构、数据的运算、存储结构&#xff08;物理结构&#xff09;&#xff0c;存储结构不同&#xff0c;运算的实现方式也不同。 本次文章包括线性表的定义和基本操作&#xff0…

java零基础入门-map(上)

一、教学目标 掌握何为map能够说出map集合的特点。能够使用map集合添加元素、删除元素等伴生方法。 二、正文 1、概述 说起map&#xff0c;想必大家并不陌生吧。之前我在讲Collection集合的时候&#xff0c;我是给大家提过一嘴&#xff0c;我说Collection集合被称为单列集合…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的人群密度检测系统(深度学习模型+UI界面+训练数据集)

摘要&#xff1a;开发人群密度检测系统对于公共安全等领域具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个人群密度检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型…

07-java基础-锁之AQSReentrantLockBlockingQueueCountDownLatchSemapho

文章目录 0&#xff1a;AQS简介-常见面试题AQS具备特性state表示资源的可用状态AQS定义两种资源共享方式AQS定义两种队列自定义同步器实现时主要实现以下几种方法&#xff1a;同步等待队列条件等待队列 1&#xff1a;AQS应用之ReentrantLockReentrantLock如何实现synchronized不…

uniapp相关内容

一、设置uni原生事件类型 示例&#xff1a;获取手机号事件类型为 UniHelper.ButtonOnGetphonenumber 格式为&#xff1a;UniHelper.组件名事件名 const getphonenumber: UniHelper.ButtonOnGetphonenumber (detail) > {console.log(detail) } <button class"…

【小程序】API能力集成指南——子设备API汇总(一)

ty.device.getSubDeviceInfoList 获取子设备信息 需引入DeviceKit&#xff0c;且在>1.2.6版本才可使用 参数 Object object 属性类型默认值必填说明meshIdstring是网关设备 id 或上级节点 idcompletefunction否接口调用结束的回调函数&#xff08;调用成功、失败都会执行…

[linux] pip install -e . 和 pip install -e “.[train]“分别是什么意思

pip install -e . 和 pip install -e ".[train]" 都是 Python 包管理工具 pip 的安装命令&#xff0c;它们用于安装一个以“可编辑”模式的本地项目。这里的“可编辑”模式意味着项目被安装到当前环境中&#xff0c;但是它链接到你实际代码所在的位置&#xff0c;这样…

oracle临时表空间不释放

项目报错 nested exception is java.sql.SQLException: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP 原因是临时表空间满了&#xff0c;临时表空间一直增长&#xff0c;未释放导致临时表空间使用率100%。 查询临时表空间使用率 --临时表空间利用率…

拓扑排序 很简单

原文链接&#xff1a;图论第四讲&#xff1a;拓扑排序 说明&#xff1a;CSDN和公众号文章同步发布&#xff0c;需要第一时间收到最新内容&#xff0c;请关注公众号【比特正传】。 之前的图论合集文章中讲了图的存储遍历、最短路等算法&#xff0c;文章链接如下 图论第一讲&am…