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

python函数装饰器保存信息

1 python函数装饰器保存信息

python函数装饰器,可以通过实例属性、全局变量、非局部变量和函数属性,来保存被装饰函数的状态信息。

1.1 统计调用并跟踪

描述

通过装饰器统计函数调用次数,并且用打印来跟踪调用记录。

此装饰器用类的__call__()方法来实现。

(1) 装饰器返回实例对象;

(2) 构造函数初始化调用次数为0,记录传入的被装饰函数;

(3) 重载__call__()方法,每次调用计增一次调用次数,并且调用被装饰器函数和打印调用信息;

(4) 返回的实例对象赋值给原函数名;

(5) 调用原函数,相当于实例名(),而括号运算符自动调用__call__()方法,从而达到统计调用次数的功能。

示例

>>> class CountTrace:def __init__(self,func):self.calls=0self.func=func#实例名()运算,自动调用__call__   def __call__(self,*args):self.calls+=1print('调用{}{}次'.format(self.func.__name__,self.calls))self.func(*args)>>> @CountTrace
def testct(x):print(x)# testct 为 CountTrace 的实例对象
>>> testct
<__main__.CountTrace object at 0x00000173D57DFDF0>  
>>> for i in range(5):testct(i+1)调用testct1次
1
调用testct2次
2
调用testct3次
3
调用testct4次
4
调用testct5次
5
>>> testct.calls
5

1.2 保存被装饰的状态信息

python的实例属性、全局变量、非局部变量和函数属性,可以保存被装饰函数的状态信息。

1.2.1 类实例属性保存被装饰函数

描述

通过类实例属性来保存被装饰函数的状态信息。

(1) 将被装饰函数赋值保存到类实例属性self.func;

(2) 每装饰一个函数就创建一个类实例;

(3) 被装饰的多个不同函数,相当于多个不同的类实例,保存各自的状态信息;

示例

>>> class CountTrace:def __init__(self,func):self.calls=0self.func=func#实例名()运算,自动调用__call__   def __call__(self,*args,**kargs):self.calls+=1print('调用{}{}次'.format(self.func.__name__,self.calls))return self.func(*args,**kargs)
>>> @CountTrace
def testct(x):print(x)>>> @CountTrace
def testsquare(x):print(x**2)
>>> testct(2)
调用testct1次
2
>>> testsquare(3)
调用testsquare1次
9

1.2.2 嵌套函数global保存被装饰函数

描述

通过嵌套函数的global来保存被装饰函数的状态信息,实现被装饰函数统一计数。

(1) 定义全局比变量calls;

(2) 嵌套函数声明全局变量calls,并进行递增;

(3) 返回的wrapper赋值给各自被装饰的函数,并且共用全局变量calls,所以多个不同的被装饰函数,共用一个计数器;

示例

>>> calls=0
>>> def counttrace(func):def wrapper(*args,**kargs):global callscalls+=1print('调用{}{}次'.format(func.__name__,calls))return func(*args,**kargs)return wrapper>>> @counttrace
def testct(x):print(x)>>> @counttrace
def testsquare(x):print(x**2)>>> testct('梯阅线条')
调用testct1次
梯阅线条
# 多个被装饰的函数共用一个计数器
>>> testsquare(3)
调用testsquare2次
9

global

描述

函数主体内部声明变量为global,则可以对函数外部的变量进行修改。

示例

>>> vg='tyxt.work'
>>> def noglobal():vg='梯阅线条'>>> def hvglobal():global vgvg='梯阅线条'>>> vg
'tyxt.work'
>>> noglobal()
>>> vg
'tyxt.work'
>>> hvglobal()
>>> vg
'梯阅线条'

1.2.3 嵌套函数nonlocal保存被装饰函数

描述

通过嵌套函数的nonlocal来保存被装饰函数的状态信息,实现对被装饰函数各自计数。

(1) 外部函数初始化变量calls=0;

(2) 嵌套函数声明nonlocal变量calls,并进行递增;

(3) 返回的wrapper赋值给各自被装饰的函数,并且使用各自的calls,多个不同的被装饰函数,各用一个计数器;

示例

>>> def counttrace(func):calls=0def wrapper(*args,**kargs):nonlocal callscalls+=1print('调用{}{}次'.format(func.__name__,calls))return func(*args,**kargs)return wrapper>>> @counttrace
def testct(x):print(x)>>> @counttrace
def testsquare(x):print(x**2)>>> testct('梯阅线条')
调用testct1次
梯阅线条
# 多个被装饰的函数各用一个计数器
>>> testsquare(3)
调用testsquare1次
9

nonlocal

描述

python通过nonlocal修改嵌套函数的外部函数的变量。

示例

>>> def f1():s='tyxt.work'def f2():s='梯阅线条'print('f2=',s)f2()print('f1=',s)>>> f1()
f2= 梯阅线条
f1= tyxt.work
>>> def f1():s='tyxt.work'def f2():# 通过nonlocal直接修改嵌套作用域的变量nonlocal ss='梯阅线条'print('f2=',s)f2()print('f1=',s)>>> f1()
f2= 梯阅线条
f1= 梯阅线条

1.2.4 函数属性保存被装饰函数

描述

通过嵌套函数属性来保存被装饰函数的状态信息,实现对被装饰函数各自计数。

(1) 嵌套函数内部,通过wrapper.calls+=1,进行递增;

(2) 嵌套函数wrapper后面,对calls进行初始化;

(3) 返回的wrapper赋值给各自被装饰的函数,并且使用各自的calls,所以多个不同的被装饰函数,各用一个计数器;

示例

>>> def counttrace(func):def wrapper(*args,**kargs):wrapper.calls+=1print('调用{}{}次'.format(func.__name__,wrapper.calls))return func(*args,**kargs)# 定义函数 wrapper 后,再进行属性赋值wrapper.calls=0return wrapper>>> @counttrace
def testct(x):print(x)>>> @counttrace
def testsquare(x):print(x**2)>>> testct('梯阅线条')
调用testct1次
梯阅线条
# 多个被装饰的函数各用一个计数器
>>> testsquare(3)
调用testsquare1次
9

相关文章:

python函数装饰器保存信息

1 python函数装饰器保存信息 python函数装饰器&#xff0c;可以通过实例属性、全局变量、非局部变量和函数属性&#xff0c;来保存被装饰函数的状态信息。 1.1 统计调用并跟踪 描述 通过装饰器统计函数调用次数&#xff0c;并且用打印来跟踪调用记录。 此装饰器用类的__ca…...

AI真正的Killer App 仍然缺席

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Docker 镜像以及镜像分层

Docker 镜像以及镜像分层 1 什么是镜像2 Docker镜像加载原理2.1 UnionFs&#xff1a;联合文件系统2.2 Docker镜像加载原理2.3 Docker镜像的特点 3 镜像的分层结构4 可写的容器层 1 什么是镜像 镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行…...

aigc 启动器 sd-webui-aki-v4 decode_base64_to_file

下载地址&#xff1a; SD-WebUI启动器 绘世-启动器 | 万物档案 decode_base64_to_file报错&#xff1a; File "E:\BaiduNetdiskDownload\stable diffusion\sd-webui-aki-v4\extensions\sd-webui-controlnet\scripts\external_code.py", line 7, in <module>fr…...

【C++进阶05】AVL树的介绍及模拟实现

一、AVL树的概念 二叉搜索树的缺点 二叉搜索树虽可以缩短查找效率 但如果数据有序或接近有序 二叉搜索树将退化为单支树 查找元素相当于在顺序表中搜索元素&#xff0c;效率低下 AVL树便是解决此问题 向二叉搜索树中插入新结点 并保证每个结点的左右子树 高度之差的绝对值不超…...

MySQL视图 索引 面试题

一. 视图 视图&#xff1a;一种虚拟存在的表&#xff0c;行和列的数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的&#xff0c;只保存了sql逻辑&#xff0c;不保存查询结果 视图语法 -- 创建 create view 视图名 as 查询语句;-- 使用 select * f…...

JAVA实现文件上传至阿里云

注册阿里云账号后,开通好对象存储服务&#xff08;OSS&#xff09;&#xff0c;三个月试用 阿里云登录页 (aliyun.com) 目录 一.创建Bucket 二.获取AccessKey&#xff08;密钥&#xff09; 三.参考官方SDK文件&#xff0c;编写入门程序 1.复制阿里云OSS依赖&#xff0c;粘贴…...

设计模式之外观模式【结构型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…...

Qt QCheckBox复选按钮控件

文章目录 1 属性和方法1.1 文本1.2 三态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的复选按钮类是QCheckBox它和单选按钮很相似&#xff0c;单选按钮常用在“多选一”的场景&#xff0c;而复选按钮常用在"多选多"的场景比如喜欢的水果选项中&#xf…...

加速科技ST2500 数模混合信号测试设备累计装机量突破500台!

国产数字机&#xff0c;测试中国芯&#xff01;新年伊始&#xff0c;国产半导体测试设备领军企业加速科技迎来了振奋人心的一刻&#xff0c;ST2500 数模混合信号测试设备累计装机量突破500台&#xff01;加速科技凭借其持续的创新能力、完善的解决方案能力、专业热忱的本地化服…...

ASP.NETCore WebAPI 入门 杨中科

ASP.NETCore WebAPI入门1 回顾 mvc开发模式 前端代码和后端代码是混在一个项目之中 WEB API 1、什么是结构化的Http接口。Json。 2、Web API项目的搭建。 3、Web API项目没有Views文件夹。 4、运行项目&#xff0c;解读代码结构。 5、【启用OpenAPI支持】→>swagger,在界…...

问题 C: 活动选择

题目描述 学校在最近几天有n个活动&#xff0c;这些活动都需要使用学校的大礼堂&#xff0c;在同一时间&#xff0c;礼堂只能被一个活动使。由于有些活动时间上有冲突&#xff0c;学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。    现在给出n个活动使用礼堂的起…...

SpringBoot学习(五)-Spring Security配置与应用

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! Spring Security Spring Security是一个基于Java的开源框架&#xff0c;用于在Java应用程…...

Java解决删除子串后的字符串最小长度

Java解决删除子串后的字符串最小长度 01 题目 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作&#xff0c;在每一步操作中&#xff0c;你可以从 s 中删除 任一个 "AB" 或 "CD" 子字符串。 通过执行操作&#xff0c;删除所…...

日志系统一(elasticsearch+filebeat+logstash+kibana)

目录 一、es集群部署 安装java环境 部署es集群 安装IK分词器插件 二、filebeat安装&#xff08;docker方式&#xff09; 三、logstash部署 四、kibana部署 背景&#xff1a;因业务需求需要将nginx、java、ingress日志进行收集。 架构&#xff1a;filebeatlogstasheskib…...

游戏版 ChatGPT,要用 AI 角色完善生成工具实现 NPC 自由

微软与 AI 初创公司 Inworld 合作&#xff0c;推出基于 AI 的角色引擎和 Copilot 助理&#xff0c;旨在提升游戏中 NPC 的交互力和生命力&#xff0c;提升游戏体验。Inworld 致力于打造拥有灵魂的 NPC&#xff0c;通过生成式 AI 驱动 NPC 行为&#xff0c;使其动态响应玩家操作…...

加工零件的题解

目录 原题描述&#xff1a; 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 题目大意&#xff1a; 主要思路&#xff1a; 但是我们怎么才能判断出x走到1时L是偶数还是奇数呢&#xff1f; 初始化&#xff1a;…...

走进shell

Linux系统启动时&#xff0c;会自动创建多个虚拟控制台。虚拟控制台是运行在Linux系统内存中的终端会话。 打开Linux控制台Terminal使用tty命令查看当前使用的虚拟控制台。 注&#xff1a;tty 表示电传打字机(teletypewriter) $ tty /dev/pts/0表示当前使用的是/dev/pts/0 虚拟…...

【Python】使用tkinter设计开发Windows桌面程序记事本(2)

上一篇&#xff1a;【Python】使用tkinter设计开发Windows桌面程序记事本&#xff08;1&#xff09;-CSDN博客 下一篇&#xff1a; 作者发炎 此代码模块是继承上一篇文章的代码模块的基础上开始设计开发的。 如果不知道怎么新建"记事本项目"文件夹&#xff0c;请参…...

Flutter DateTime 常用处理

今天介绍一下 DateTime 的一些常用功能&#xff0c;对其进行一个整理。 最近在开发过程中好多时候都会使用到时间方面的方法&#xff0c;心想还是统一处理一下&#xff0c;封装一个管理类&#xff0c;这个类可以满足我们开发过程中常用的时间方法。 今天正好整理了一下&#…...

3大创新突破让千元机械臂媲美工业级性能:Faze4开源六轴机器人DIY全指南

3大创新突破让千元机械臂媲美工业级性能&#xff1a;Faze4开源六轴机器人DIY全指南 【免费下载链接】Faze4-Robotic-arm All files for 6 axis robot arm with cycloidal gearboxes . 项目地址: https://gitcode.com/gh_mirrors/fa/Faze4-Robotic-arm 价值定位&#xff…...

避坑指南:Ollama部署DeepSeek-R1时,如何安全地开放API端口给内网其他服务调用?

深度解析&#xff1a;Ollama部署DeepSeek-R1时内网API安全开放实战 当你在一台Linux服务器上成功部署了Ollama和DeepSeek-R1模型后&#xff0c;下一步自然是想让内网中的其他服务也能调用这个强大的AI能力。但直接开放端口就像把家门钥匙插在锁上——方便但危险。本文将带你深入…...

nli-distilroberta-base代码实例:Python调用DistilRoBERTa实现Entailment识别

nli-distilroberta-base代码实例&#xff1a;Python调用DistilRoBERTa实现Entailment识别 1. 项目概述 自然语言推理(Natural Language Inference, NLI)是自然语言处理中的一项重要任务&#xff0c;用于判断两个句子之间的逻辑关系。nli-distilroberta-base是基于DistilRoBER…...

从‘丐版’到‘神板’:深度拆解Raspberry Pi Zero 2 W的散热设计与性能压榨指南

从‘丐版’到‘神板’&#xff1a;深度拆解Raspberry Pi Zero 2 W的散热设计与性能压榨指南 当一款信用卡大小的开发板搭载四核处理器时&#xff0c;散热与性能的平衡便成为硬件极客们最热衷的挑战。Raspberry Pi Zero 2 W以不到15美元的定价&#xff0c;却藏着令人惊喜的工程智…...

Google与Cohere发布新一代音频AI模型

Google LLC和Cohere Inc.今日发布了专为音频处理任务优化的新人工智能模型。这家搜索巨头的算法Gemini 3.1 Flash Live能够自动化客户服务交互。Cohere的新AI模型则专为语音转录而设计。两款模型的输出质量都比其前代产品有显著提升。企业可使用Gemini 3.1 Flash Live构建语音智…...

从硬件迷宫到macOS殿堂:OpCore Simplify如何重塑黑苹果配置体验

从硬件迷宫到macOS殿堂&#xff1a;OpCore Simplify如何重塑黑苹果配置体验 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于许多技术爱好者来说&a…...

无需编程!用OFA模型快速搭建图文匹配工具:上传即测,结果秒出

无需编程&#xff01;用OFA模型快速搭建图文匹配工具&#xff1a;上传即测&#xff0c;结果秒出 1. 图文匹配的痛点与解决方案 你有没有遇到过这样的困扰&#xff1f;在网上购物时&#xff0c;商品图片和描述对不上&#xff1b;浏览社交媒体时&#xff0c;配图与文字内容完全…...

深入解析Golang中的占位符:%w、%v、%s的应用与最佳实践

1. Golang占位符基础入门 刚开始接触Golang时&#xff0c;fmt包里的那些百分号开头的占位符确实让我有点懵。记得第一次看到%s、%v、%w这些符号时&#xff0c;我还以为是什么特殊运算符。后来在实际项目中用多了才发现&#xff0c;这些看似简单的占位符&#xff0c;其实是Gola…...

DIY电源改造必备:TL594与SG3524 PWM控制器实战对比(附电路图)

DIY电源改造实战&#xff1a;TL594与SG3524 PWM控制器深度对比与电路设计指南 1. 从零认识PWM控制器的核心价值 在电子爱好者的工作台上&#xff0c;电源改造项目总是充满魅力与挑战。无论是将旧电脑电源改造成可调实验室电源&#xff0c;还是为自制音响系统设计高效供电模块&a…...

用腾讯云轻量锐驰和对象存储,手把手教你30分钟搞定私人不限速网盘(附SSL证书配置)

零基础30分钟搭建高性能私人网盘&#xff1a;腾讯云轻量锐驰对象存储实战指南 你是否也受够了公有网盘动辄几百KB的下载速度&#xff1f;每次分享文件给朋友&#xff0c;对方总要忍受龟速下载的煎熬。更别提那些突然消失的文件和频繁弹出的会员广告——是时候拥有一个完全自主掌…...