当前位置: 首页 > news >正文

系统学习Python——装饰器:直接管理函数和类

分类目录:《系统学习Python》总目录


在《系统学习Python——装饰器》系列文章中,我们的大多数示例都设计来拦截函数和实例创建调用。这对于装饰器来说很典型,但是它们并不限于这一角色。因为装饰器通过装饰器代码来运行新的函数和类,从而有效地工作,它们也可以用来管理函数和类对象自身,而不只是管理对它们随后的调用。

例如,假设我们需要将被另一个应用程序使用的方法或类注册到一个API上,以便随后处理(可能该API会调用该对象以响应事件)。我们可以提供一个注册函数,在对象定义之后手动地调用该函数,但装饰器使得你的意图更为明显。

这一思路的一种简单实现如下,其中定义了一个装饰器,它既应用于函数也应用于类,并把对象添加到一个基于字典的注册表中。由于它返回对象本身而不是一个包装器,因此它没有拦截随后的调用:

registry = {}
def register(obj):registry[obj.__name__] = objreturn obj@register
def square(x):return x**2@register
def cube(x):return x**3@register
class Eggs:def __init__(self, x):slf.data = xdef __str__(self):return str(self.data)for name in registry:print(name, '=>', registry[name])

输出:

square => <function square at 0x00000267F2E36700>
cube => <function cube at 0x00000267F49B3790>
Eggs => <class '__main__.Eggs'>

当这段代码运行的时候,被装饰的对象按照名称添加到注册表中,但当随后调用它们的时候,它们仍然按照最初的编写方式工作,而没有指向一个包装器层。实际上,我们的对象可以手动运行,或从注册表内部运行。

例如,一个用户界面可能使用这样的技术,为用户动作注册回调处理程序。处理程序可能通过数或类名来注册,就像这里所做的一样,或者可以使用装饰器参数来指定主体事件;包围装饰器的一条额外的def语句可能会用来保持这样的参数以便在装饰时使用。

这个例子是编造的,但是其技术很通用。例如,函数装饰器也可能用来处理函数属性,并且类装饰器可能动态地插人新的类属性,甚至新的方法。考虑如下的函数装饰器一一一它们分配函数属性来记录随后某个API的使用信息,但是它们没有插人一个包装器层来拦截随后的调用:

def decorate(func):func.marked = Truereturn func@decorate
def spam(x, y):return x + yspam.marked

输出:

True

输入:

def annotate(text):def decorate(func):func.label = textreturn funcreturn decorate@annotate('spam data')
def spam(x, y):return x + yspam(1, 1), spam.label

输出:

(2, 'spam data')

这样的装饰器直接扩展了函数和类,但没有捕捉对它们的随后调用。我们将在后面的文章见到多的管理类的类装饰的例子,因为这证明了它已经转向了元类的领域。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.

相关文章:

系统学习Python——装饰器:直接管理函数和类

分类目录&#xff1a;《系统学习Python》总目录 在《系统学习Python——装饰器》系列文章中&#xff0c;我们的大多数示例都设计来拦截函数和实例创建调用。这对于装饰器来说很典型&#xff0c;但是它们并不限于这一角色。因为装饰器通过装饰器代码来运行新的函数和类&#xff…...

Leetcode 3049. Earliest Second to Mark Indices II

Leetcode 3049. Earliest Second to Mark Indices II 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;3049. Earliest Second to Mark Indices II 1. 解题思路 这道题我看貌似难度报表&#xff0c;比赛的时候貌似只有36个人搞定了这道题目&#xff0c;然后最快的人…...

CrossOver 24下载-CrossOver 24 for Mac下载 v24.0.0中文永久版

CrossOver 24是一款可以让mac用户能够自由运行和游戏windows游戏软件的虚拟机类应用&#xff0c;虽然能够虚拟windows但是却并不是一款虚拟机&#xff0c;也不需要重启系统或者启动虚拟机&#xff0c;类似于一种能够让mac系统直接运行windows软件的插件。它以其出色的跨平台兼容…...

算法设计.

文章目录 1. 贪心算法&#xff1a;只看当前1.1 零钱兑换问题&#xff1a;力扣322 2. 活动选择问题3. 动态规划3.1 不同路径&#xff1a;3.2 0-1背包问题3.3 完全背包问题3.4 零钱兑换-动态规划 4. 最长公共字串--动态规划5. 最长公共子序列 1. 贪心算法&#xff1a;只看当前 1…...

20240304金融读报:票据贴现数据挖掘与新质生产力信贷创新

1、【他山之石】票据贴现数据挖掘&#xff1a;邮储三步走&#xff08;为存量科技企业提供贴现、拉国家科技名单拓客、通过贴现激活睡眠对公户、提供不止贴现业务&#xff09; 2、【宏观经济】函数推算的潜在增长率2025之前为4%&#xff0c;2025-2035间为3%。破局在于通过改革、…...

05. Nginx入门-Nginx访问控制

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径&#xff1a;/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…...

S2---FPGA-A7板级原理图硬件实战

视频链接 FPGA-A7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-A7板级原理图硬件实战 基于XC7A100TFGG484的FPGA硬件设计流程图 A7核心板&#xff0c;是基于XILINX公司的ARTIX-7系列100T的XC7A100T,2FGG484I这款芯片开发的高性能核心板&#xff0c;具有高速&#xff0c;高带宽&a…...

RK DVP NVP6158配置 学习

NVP6158简介 NVP6158C是一款4通道通用RX&#xff0c;提供高质量图像的芯片。它接受来自摄像机和其他视频信号的独立4通道通用输入来源。它将4通道通用1M至8M 7.5P视频格式数字化并解码为代表8位ITU-R BT.656/1120 4:2:2格式的数字分量视频&#xff0c;并将单独的BT.601格式与27…...

C++基础2:C++基本数据类型和控制结构

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏&#xff0c;参考书籍&#xff1a;《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 2.C基本数据类型和控制结构 2.1 C基本数据类型 程序是由算法…...

HFSS仿真双频微带天线学习笔记

HFSS仿真双频微带天线 文章目录 HFSS仿真双频微带天线1、 求解器设置2、 建模3、 激励方式设置4、 边界条件设置5、 扫频设置6、 设计检查&#xff0c;仿真分析7、 数据后处理 这里重点关注HFSS软件的操作&#xff0c;关于理论知识将在后面的文章中进行更新。 设计要求&#xf…...

【十一】【SQL】外连接(左外连接,右外连接)

数据库中的外连接&#xff08;Outer Join&#xff09;用于连接两个表&#xff0c;并包括两个表中的匹配行以及左表&#xff08;LEFT JOIN&#xff09;或右表&#xff08;RIGHT JOIN&#xff09;中未匹配的行。外连接分为两种主要类型&#xff1a; 左外连接&#xff08;LEFT OU…...

敏捷开发模型:一种灵活、协作和持续的软件开发方法

敏捷开发模型&#xff1a;一种灵活、协作和持续的软件开发方法 引言 在软件开发领域&#xff0c;随着市场需求的不断变化和技术的迅速发展&#xff0c;传统的瀑布模型逐渐暴露出其局限性。为了应对这些挑战&#xff0c;敏捷开发模型应运而生。敏捷开发模型强调灵活、协作和持…...

软件设计师10--计算机组成与体系结构章节回顾

软件设计师10--计算机组成与体系结构章节回顾 章节重要内容考情分析 章节重要内容 考情分析...

数据库分库分表中间件选择

目前分库分表的中间件有三种设计思路&#xff0c;分别是&#xff1a; 采用分散式架构&#xff0c;适用于用Java开发的高性能轻量级OLTP应用程序&#xff0c;以Sharding-JDBC为代表。采用中间层Proxy架构&#xff0c;提供了静态输入和所有语言支持&#xff0c;适用于OLAP应用程…...

代码随想录算法训练营第22天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 一、力扣235.二叉搜索树的最近公共祖先1.1 题目1.2 思路1.3 代码 二、力扣701.二叉搜索树中的插入操作2.1 题目2.2 思路2.3 代码 三、力扣450.删除二叉搜索树中的节点3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣235.二叉搜索树的最近公共祖先 1.1 题目 1.2 思路 利用二叉…...

基于SpringBoot的医护人员排班系统详细开题报告(源码)

项目源码&#xff1a;https://gitee.com/oklongmm/biye2​ 引言 医护人员排班系统是医疗机构中的重点管理工作之一。借助现代化的计算机技术&#xff0c;可以大大提升排班的效率和精准度。因此&#xff0c;本研究旨在使用SpringBoot框架设计和实现一个功能完善的医护人员排班…...

CDH6.3.1离线安装

一、从官方文档整体认识CDH 官方文档地址如下&#xff1a; CDH Overview | 6.3.x | Cloudera Documentation CDH是Apache Hadoop和相关项目中最完整、测试最全面、最受欢迎的发行版。CDH提供Hadoop的核心元素、可扩展存储和分布式计算&#xff0c;以及基于Web的用户界面和重…...

Pytorch之卷积操作

卷积是一种基本的数学操作&#xff0c;常用于信号处理和图像处理领域。在计算机视觉中&#xff0c;卷积操作是一种重要的技术&#xff0c;用于提取图像的特征并进行图像处理。 卷积操作基于一个卷积核&#xff08;也称为滤波器或权重&#xff09;&#xff0c;它是一个小的矩阵…...

2024年春招小红书前端实习面试题分享

文章目录 导文面试重点一、方便介绍一下&#xff0c;你之前实习都做了什么嘛&#xff1f;二、 可以讲一下封装组件相关逻辑嘛&#xff1f;1. 为什么要封装组件&#xff1f;2. 封装组件的步骤3. 封装组件的原则4. 组件的复用和扩展5. 组件的维护和文档 三、项目的性能优化你有什…...

软件测试--性能测试工具JMeter

软件测试--性能测试工具JMeter 主流性能测试工具1.主流性能测试工具Loadrunner和Jmeter对比 —— 相同点2.主流性能测试工具Loadrunner和Jmeter对比 —— 不同点JMeter基本使用JMeter环境搭建1.安装JDK:2.安装Jmeter:3.注意点:JMeter功能概要1. JMeter文件目录介绍1.1 bin目…...

docker零基础入门:用快马ai生成带详细注释的容器化示例项目

最近在学习Docker技术&#xff0c;发现对于新手来说&#xff0c;从零开始配置容器环境确实会遇到不少坑。好在发现了InsCode(快马)平台&#xff0c;它提供的AI辅助功能可以快速生成带详细注释的Docker示例项目&#xff0c;特别适合像我这样的初学者。下面分享下我的学习过程&am…...

AI辅助开发:让快马智能生成代码优化50台云桌面的动态资源调度策略

今天想和大家分享一个特别实用的技术实践——如何用AI辅助开发来优化云桌面的资源调度。最近在做一个项目&#xff0c;需要在一台主机上运行50台云桌面&#xff0c;这对资源调度提出了很高的要求。传统的静态分配方式显然不够灵活&#xff0c;于是我开始探索AI辅助开发的解决方…...

2025届学术党必备的十大AI辅助写作网站实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在于学术写作范畴之内&#xff0c;AI工具正一步一步地变成提高论文质量以及写作效率的关键辅…...

实测Qwen-Image-Edit-2511:输入一张图,输出360°环绕视角,效果太强了

实测Qwen-Image-Edit-2511&#xff1a;输入一张图&#xff0c;输出360环绕视角&#xff0c;效果太强了 1. 引言&#xff1a;单图变多视角的技术突破 想象一下&#xff0c;你只需要一张普通的商品照片&#xff0c;就能自动生成360度全方位的展示效果。这不是科幻电影里的场景&…...

MJh代码混淆实战指南:使用Obfuscar构建坚不可摧的安全防线

在当今数字化时代&#xff0c;保护.NET应用程序的源代码安全变得尤为重要。你是否担心自己的知识产权被轻易窃取&#xff1f;是否希望防止竞争对手通过反编译分析你的核心业务逻辑&#xff1f;今天&#xff0c;我将为你详细介绍一款强大的开源混淆工具——Obfuscar&#xff0c;…...

Source Han Serif CN全解析:免费商用字体的7大维度深度指南

Source Han Serif CN全解析&#xff1a;免费商用字体的7大维度深度指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 一、问题&#xff1a;中文字体应用的三大行业困境 如何突破中文…...

GIS底图大全

数据名称&#xff1a;GIS底图大全数据分类&#xff1a;文档资料网盘链接&#xff1a;通过百度网盘分享的文件&#xff1a;GIS底图.zi…链接:https://pan.baidu.com/s/1-Ko3uEp5IN7YJOSHd8cqaA 提取码:fhwb复制这段内容打开「百度网盘APP 即可获取」数据来源&#xff1a;来源于网…...

基于python的本地选择图像接入百度云api的图像识别项目

项目灵感来源于老师布置的任务。怎么感觉老师这个题目也是ai生成的~。~ 题目&#xff1a;基于 AI 视觉的本地图像分析脚本 任务要求&#xff1a; 请使用 Python 编写一个通用的图像分析脚本&#xff0c;具体流程需满足以下三个步骤&#xff1a; * 本地选图&#xff1a;程序运…...

PyTorch 2.8镜像实战解析:RTX 4090D上Stable Video Diffusion推理提速实测

PyTorch 2.8镜像实战解析&#xff1a;RTX 4090D上Stable Video Diffusion推理提速实测 1. 镜像环境深度解析 1.1 硬件适配优化方案 这个PyTorch 2.8镜像针对RTX 4090D显卡进行了全方位优化&#xff0c;就像给赛车手量身定制了高性能装备。24GB显存的设计让大模型推理不再捉襟…...

Cursor Pro功能解锁技术解析与实战方案

Cursor Pro功能解锁技术解析与实战方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial request limit. / Too m…...