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…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...