Python基础篇_修饰符(Decorators)【下】
上一篇:Python基础篇_修饰符(Decorators)【中】@property、@<attribute_name>.setter、@<attribute_name>.deleter、@functools.lru_cache(maxsize=None)
Python基础篇_修饰符(Decorators)【下】
- Python基础篇_修饰符(Decorators)【下】
- 一、修饰符一般特点
- 二、常用的修饰符以及用法举例
- 7) @abc.abstractmethod,抽象方法
- 8) @functools.singledispatch,函数重载
- 9) @contextlib.contextmanager,上下文管理
Python基础篇_修饰符(Decorators)【下】
Python中有多种修饰符,这些修饰符用于指定方法的特殊行为或属性,也是用于修改函数行为的特殊参数。
一、修饰符一般特点
- 修饰符只能用于类定义中,不能用于普通函数中
- 属性修饰符是可叠加的,也就是说,一个方法可以同时被多个属性修饰符修饰
二、常用的修饰符以及用法举例
7) @abc.abstractmethod,抽象方法
@abc.abstractmethod
用于指示一个方法是抽象的,这意味着这个方法必须在任何非抽象的子类中被重写。它属于abc
模块,即抽象基类模块。
当你定义一个抽象基类并使用@abc.abstractmethod
装饰器标记一个方法时,任何子类都必须实现这个方法,否则它将引发TypeError
。
示例1: AbstractClassExample
类的抽象方法my_abstract_method
import abcclass AbstractClassExample(metaclass=abc.ABCMeta):@abc.abstractmethoddef my_abstract_method(self):passclass ConcreteClass(AbstractClassExample):def my_abstract_method(self):print("This is the implementation of the abstract method.")# 下面的代码将引发TypeError,因为my_abstract_method在BrokenClass中未被实现。
# class BrokenClass(AbstractClassExample):
# pass
在这个例子中,AbstractClassExample是一个抽象基类,它有一个抽象方法my_abstract_method
任何继承自AbstractClassExample的子类都必须实现my_abstract_method方法
ConcreteClass是一个实现了该方法的子类
尝试创建一个没有实现该方法的子类(如被注释掉的BrokenClass)将引发TypeError
示例2:Vehicle
类的抽象方法start
、stop
import abcclass Vehicle(metaclass=abc.ABCMeta):@abc.abstractmethoddef start(self):pass@abc.abstractmethoddef stop(self):passclass Car(Vehicle):def start(self):print("Car started!")def stop(self):print("Car stopped!")class Bike(Vehicle):def start(self):print("Bike started!")def stop(self):print("Bike stopped!")# 下面的代码将引发TypeError,因为Vehicle是一个抽象基类,要求子类必须实现start和stop方法。
# class Train(Vehicle):
# pass
在这个例子中,AbstractClassExample是一个抽象基类,它有一个抽象方法my_abstract_method
任何继承自AbstractClassExample的子类都必须实现my_abstract_method方法
ConcreteClass是一个实现了该方法的子类
尝试创建一个没有实现该方法的子类(如被注释掉的BrokenClass)将引发TypeError
示例3:Shape
类的抽象方法area
import abcclass Shape(metaclass=abc.ABCMeta):@abc.abstractmethoddef area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.height# 下面的代码将引发TypeError,因为Shape是一个抽象基类,要求子类必须实现area方法。
# class Triangle(Shape):
# pass
在这个例子中,Shape是一个抽象基类,有一个抽象方法area。任何子类必须实现这个方法。
Circle和`Rectangle`都是Shape的子类,并实现了area方法。
尝试创建一个没有实现该方法的子类(如被注释掉的Triangle)将引发TypeError
8) @functools.singledispatch,函数重载
@functools.singledispatch
是functools
模块提供的一个装饰器,用于实现多分派。具体来说,它可以将函数重定向到其他函数,基于第一个参数的类型。
示例1:foo
方法重载
from functools import singledispatch# 定义一个使用 @singledispatch 的函数
@singledispatch
def foo(arg):raise NotImplementedError("Unsupported type for foo")# 定义一个具体的实现,用于处理字符串类型的参数
@foo.register(str)
def _(arg):return f"You provided a string: {arg}"# 定义一个具体的实现,用于处理整数类型的参数
@foo.register(int)
def _(arg):return f"You provided an integer: {arg}"# 使用函数
print(foo("Hello"))
print(foo(42))
print(foo(0.5))
# 执行结果
You provided a string: Hello
You provided an integer: 42
NotImplementedError: Unsupported type for foo
示例2:bar
方法重载
from functools import singledispatch# 定义一个使用 @singledispatch 的函数
@singledispatch
def bar(arg):raise NotImplementedError("Unsupported type for bar")# 定义一个具体的实现,用于处理字符串类型的参数
@bar.register(str)
def _(arg):return f"You provided a string: {arg}"# 定义一个具体的实现,用于处理整数类型的参数
@bar.register(int)
def _(arg):return f"You provided an integer: {arg}"# 定义一个具体的实现,用于处理列表类型的参数
@bar.register(list)
def _(arg):return f"You provided a list: {arg}"# 使用函数
print(bar("Hello"))
print(bar(42))
print(bar([1, 2, 3]))
print(bar(0.5))
# 执行结果
You provided a string: Hello
You provided an integer: 42
You provided a list: [1, 2, 3]
NotImplementedError: Unsupported type for bar
示例3:baz
方法重载
from functools import singledispatch# 定义一个使用 @singledispatch 的函数
@singledispatch
def baz(arg):raise NotImplementedError("Unsupported type for baz")# 定义一个具体的实现,用于处理字符串类型的参数
@baz.register(str)
def _(arg):return f"You provided a string: {arg}"# 定义一个具体的实现,用于处理整数类型的参数
@baz.register(int)
def _(arg):return f"You provided an integer: {arg}"# 定义一个具体的实现,用于处理列表类型的参数
@baz.register(list)
def _(arg):return f"You provided a list: {arg}"# 定义一个更通用的实现,用于处理其他类型
@baz.register
def _(arg):return f"You provided an unknown type: {type(arg)}"# 使用函数
print(baz("Hello"))
print(baz(42))
print(baz([1, 2, 3]))
print(baz(0.5))
# 执行结果
You provided a string: Hello
You provided an integer: 42
You provided a list: [1, 2, 3]
You provided an unknown type: <class 'float'>
9) @contextlib.contextmanager,上下文管理
@contextlib.contextmanager
用于简化上下文管理器的创建。上下文管理器允许你在代码的某个特定部分设置一个上下文,该上下文在其他部分可能无法访问或可能更改。常见的使用场景包括文件操作、线程锁等。
使用 @contextlib.contextmanager
装饰器可以使您以声明式方式编写上下文管理器,而无需实现 __enter__
和 __exit__
方法。这对于简化某些上下文管理任务非常有用。
示例1:名为 timer
的上下文管理器
接受一个名称参数并打印出开始和结束时间
import contextlib
import time@contextlib.contextmanager
def timer(name):print(f"Starting {name}")start_time = time.time()try:yieldfinally:end_time = time.time()print(f"{name} took {end_time - start_time} seconds")with timer("my_operation"):# 在这里执行需要计时的操作time.sleep(2)
# 执行结果
Starting my_operation
my_operation took 2.00 seconds
示例2:名为 redirect_stdout
的上下文管理器
将标准输出(通常显示在控制台)重定向到一个指定的文件
import contextlib
import os@contextlib.contextmanager
def redirect_stdout(file_path):"""将标准输出重定向到指定的文件"""original_stdout = sys.stdouttry:with open(file_path, 'w') as f:sys.stdout = fyieldfinally:sys.stdout = original_stdout# 使用重定向输出的上下文管理器
with redirect_stdout('output.txt'):print("This message will be written to the file.")
示例3:名为 thread_lock
的上下文管理器
接受一个 threading.Lock
对象作为参数。这个上下文管理器确保在 with
语句块中的代码在执行时被线程锁定
import contextlib
import threading@contextlib.contextmanager
def thread_lock(lock):"""使用线程锁的上下文管理器:param lock: threading.Lock 对象"""lock.acquire()try:yieldfinally:lock.release()# 创建一个线程锁对象
lock = threading.Lock()# 使用线程锁的上下文管理器
with thread_lock(lock):# 在此块中的代码将被线程锁定,确保同一时间只有一个线程可以执行这段代码print("Doing critical section of code...")
may the odds be ever in your favor ~
相关文章:
Python基础篇_修饰符(Decorators)【下】
上一篇:Python基础篇_修饰符(Decorators)【中】property、<attribute_name>.setter、<attribute_name>.deleter、functools.lru_cache(maxsizeNone) Python基础篇_修饰符(Decorators)【下】 Python基础篇_…...

C#,十进制展开数(Decimal Expansion Number)的算法与源代码
1 十进制展开数 十进制展开数(Decimal Expansion Number)的计算公式: DEN n^3 - n - 1 The decimal expansion of a number is its representation in base -10 (i.e., in the decimal system). In this system, each "decimal place…...

Vue3快速上手(一)使用vite创建项目
一、准备 在此之前,你的电脑,需要安装node.js,我这边v18.19.0 wangdymb 2024code % node -v v18.19.0二、创建 执行npm create vuelatest命令即可使用vite创建vue3项目 有的同学可能卡主不动,可能是npm的registry设置的问题 先看下&#x…...

使用navicat导出mysql离线数据后,再导入doris的方案
一、背景 doris本身是支持直接从mysql中同步数据的,但有时候,客户不允许我们使用doris直连mysql,此时就需要客户配合将mysql中的数据手工导出成离线文件,我们再导入到doris中 二、环境 doris 1.2 三、方案 doris支持多种导入…...

re:从0开始的CSS学习之路 1. CSS语法规则
0. 写在前面 现在大模型卷的飞起,感觉做页面的活可能以后就不需要人来做了,不知道现在还有没有学前端的必要。。。 1. HTML和CSS结合的三种方式 在HTML中,我们强调HTML并不关心显示样式,样式是CSS的工作,现在就轮到C…...

npm install express -g报错或一直卡着,亲测可解决
问题描述: 最近学习vue3前端框架,安装Node.js之后,在测试是否可行时,cmd窗口执行了:npm install express -g,发现如下图所示一直卡着不动,最后还报错了,网上找了好久,各…...

机器学习11-前馈神经网络识别手写数字1.0
在这个示例中,使用的神经网络是一个简单的全连接前馈神经网络,也称为多层感知器(Multilayer Perceptron,MLP)。这个神经网络由几个关键组件构成: 1. 输入层 输入层接收输入数据,这里是一个 28x…...

vscode wsl远程连接 权限问题
问题描述:执行命令时遇到Operation not permitted 和 Permission denied问题,是有关ip地址和创建文件的权限问题,参考网络上更改wsl.conf文件等方法均无法解决,只能加sudo来解决...

VED-eBPF:一款基于eBPF的内核利用和Rootkit检测工具
关于VED-eBPF VED-eBPF是一款功能强大的内核漏洞利用和Rootkit检测工具,该工具基于eBPF技术实现其功能,可以实现Linux操作系统运行时内核安全监控和漏洞利用检测。 eBPF是一个内核内虚拟机,它允许我们直接在内核中执行代码,而无…...
配置ARM交叉编译工具的通用步骤
ARM交叉编译工具是用于编译在ARM架构上运行的代码的工具。这些工具允许开发者在一种架构(通常是x86或x64)上编写和编译代码,然后将其移植到ARM架构上运行。 ARM交叉编译工具链通常包括编译器、链接器、调试器和其他必要的工具,用…...

相机图像质量研究(5)常见问题总结:光学结构对成像的影响--景深
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...
使用django构建一个多级评论功能
,评论系统是交流和反馈的重要工具,尤其是多级评论系统,它允许用户回复特定评论,形成丰富的对话结构。这个文章是使用Django框架从零开始构建一个多级评论系统。Django是一个高级Python Web框架,它鼓励快速开发和干净、…...

测试管理_利用python连接禅道数据库并自动统计bug数据到钉钉群
测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述,直接上代码文件。 另文章基础参考博文:参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…...

Python 小白的 Leetcode Daily Challenge 刷题计划 - 20240209(除夕)
368. Largest Divisible Subset 难度:Medium 动态规划 方案还原 Yesterdays Daily Challenge can be reduced to the problem of shortest path in an unweighted graph while todays daily challenge can be reduced to the problem of longest path in an unwe…...

BFS——双向广搜+A—star
有时候从一个点能扩展出来的情况很多,这样几层之后搜索空间就很大了,我们采用从两端同时进行搜索的策略,压缩搜索空间。 190. 字串变换(190. 字串变换 - AcWing题库) 思路:这题因为变化规则很多,所以我们一层一层往外…...

LLM之LangChain(七)| 使用LangChain,LangSmith实现Prompt工程ToT
如下图所示,LLM仍然是自治代理的backbone,可以通过给LLM增加以下模块来增强LLM功能: Prompter AgentChecker ModuleMemory moduleToT controller 当解决具体问题时,这些模块与LLM进行多轮对话。这是基于LLM的自治代理的典型情况,…...

新零售的升维体验,摸索华为云GaussDB如何实现数据赋能
新零售商业模式 商业模式通常是由客户价值、企业资源和能力、盈利方式三个方面构成。其最主要的用途是为实现客户价值最大化。 商业模式通过把能使企业运行的内外各要素整合起来,从而形成一个完整的、高效率的、具有独特核心竞争力的运行系统,并通过最…...

vscode +git +gitee 文件管理
文章目录 前言一、gitee是什么?2. Gitee与VScode连接大概步骤 二、在vscode中安装git1.安装git2.安装过程3.安装完后记得重启 三、使用1.新建文件夹first2.vscode 使用 四、连接git1.初始化仓库2.设置git 提交用户和邮箱3.登陆gitee账号新建仓库没有的自己注册一个4…...
【力扣】用栈判断有效的括号
有效的括号原题地址 方法一:栈 对于特殊情况,当字符串的长度为奇数时,一定不是有效的括号。 对于一般情况,考虑使用数据结构栈。 遍历字符串, 遇到左括号时,就入栈。遇到右括号时, 若栈顶元…...
【目录】CSAPP的实验简介与解法总结(已包含Attack/Link/Architecture/Cache)
文章目录 Attack Lab(缓冲区溢出实验)对应书上Chap3Link Lab(链接实验) 对应书上Chap7Architecture Lab(体系结构实验)对应书上Chap4-5Cache Lab(缓存实验)对应书上Chap6 Attack Lab…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...