终于解决了使用Python装饰器中的一个痛点!

深入浅出:理解Python中的装饰器 首先,我们要理解的是,装饰器本质上是一个函数,它的特殊之处在于,它可以接收一个函数作为参数,并返回一个新的函数。这听起来可能有点抽象,但其实装饰器的核心思想是:在不改变原函数的定义和调用方式的情况下,为函数添加新的功能。在Python中,由于函数是一等公民,我们可以把它们赋给变量、作为参数传递,甚至可以在其他函数内部定义和返回。这些特性使得装饰器在Python中实现起来既自然又高效。通过这篇文章,我们梳理清楚了python中的解释器从基本概念到高级应用,再到实际开发场景中的装饰器使用和相关注意事项。 阅读详情

前言

如何给装饰器的参数传参,这个问题曾经困扰我好久,虽然Python版本的更新,现在这个问题终于解决了,特此记录。

疑问

首先我有一个这样的装饰器文件路径helper/log_helper.py

import traceback 
from functools import wraps 
 
from loguru import logger 
 
 
def my_logger(count): 
    def step1(foo): 
        @wraps(foo) 
        def step2(*args, **kwargs): 
            try: 
                result = foo(*args, **kwargs) 
                logger.info(f"{result=},{count=}") 
            except Exception: 
                logger.exception(traceback.format_exc()) 
 
        return step2 
 
    return step1 

然后我有个文件需要引用这个装饰器demo.py

from helper.log_helper import my_logger 
 
 
class Demo: 
    @my_logger(count=2) 
    def main(self): 
        return "in main function" 
 
 
if __name__ == '__main__': 
    d = Demo() 
    d.main() 

输出结果如下

2020-10-16 11:43:12.001 | INFO     | helper.log_helper:step2:18 - result='in main function',count=2 

这个装饰器的作用很简单,就是获取当前函数的返回值,和传入的count值。

好,现在问题来了?

如果给装饰器的参数传值呢,也就是说我的count=2,是通过传值的形式。你想到可能是这样

from helper.log_helper import my_logger 
 
COUNT=2 
class Demo: 
    @my_logger(count=COUNT) 
    def main(self): 
        return "in main function" 
 
 
if __name__ == '__main__': 
    d = Demo() 
    d.main() 

ok,这样确实可以,我们还可以使用再简化一步

from functools import partial 
from helper.log_helper import my_logger 
 
COUNT=2 
my_logger = partial(my_logger,count=2) 
 
 
class Demo: 
    @my_logger() 
    def main(self): 
        return "in main function" 
 
 
if __name__ == '__main__': 
    d = Demo() 
    d.main() 

暂时来看我们搞定了传参数的问题,这时候我们想如果外界调用了Demo类的main方法,并且向指定count的值怎么办呢?

我们知道外界调用Demo类传参的唯一途径就是向__init__里进行传参数,按照这个思路我们只能这么写了,

class Demo: 
    def __init__(self): 
        count =2 
    @my_logger(count=self.count) 
    def main(self): 
        return "in main function" 

但是这样并不可以,我们得到错误信息

NameError: name 'self' is not defined 

在装饰器中无法使用self.形式的参数,难道这个问题解决不了么?

问题解决

在Python3.7之前确实没什么可行的方案。

我们知道在Python3.7的时候引入了dataclasses,我们可以通过它来简化__init__。

改下我们的代码

from functools import partial 
 
from helper.log_helper import my_logger 
from dataclasses import dataclass 
 
@dataclass() 
class Demo: 
    count: int = 2 
    logger: my_logger = partial(my_logger, count) 
 
    @logger() 
    def main(self): 
        return "in main function" 
 
 
if __name__ == '__main__': 
    d = Demo() 
    d.main() 

如果使用Python3.8那么可以直接忽略掉dataclass

class Demo: 
    count: int = 2 
    logger: my_logger = partial(my_logger, count) 
 
    @logger() 
    def main(self): 
        return "in main function" 

这样我们就成功的解决了这个问题,突然想起来之前遇到的这个难题,现在算是解决了,希望对你有帮助。

一文了解 Python 中的装饰器 本文将带你学习装饰器在 Python 中的工作原理,如果在函数和类中使用装饰器,如何利用装饰器避免代码重复(DRY 原则,Don’t Repeat Yourself )。装饰器在 Python中是一个非常强大和有用的工具,因为它允许程序员修改函数或类的行为。装饰器允许我们包装另一个函数,以扩展包装函数的行为,而无需修改基础函数定义。这也被称为元编程,因为程序本身在程序运行时会尝试修改自身的另一部分。装饰器是​语法糖: ​在代码中利用更简洁流畅的语法实现更为复杂的功能。我们知道,Python 一切皆对象。这意 阅读详情

相关推荐

Python 中的 @wraps 装饰器使用详解

在Python编程中,装饰器(decorators)是一种非常强大的工具,可以在不修改原有函数代码的前提下,扩展函数的功能。而在编写装饰器时,functools模块中的@wraps装饰器是一个不可或缺的工具。本文将详细介绍@wraps的作用和使用方法,并通过示例代码展示其实际应用。

Rocky006的博客 1239

终于解决了使用Python装饰器中的一个痛点

点击上方“Python学习开发”,选择“加为星标”第一时间关注Python技术干货!前言 如何给装饰器的参数传参,这个问题曾经困扰我好久,虽然Python版本的更新,现在这个问题终于解决...

muzico425的博客 309

详解C语言中freopen()函数和fclose()函数的用法

C语言freopen()函数:打开文件函数,并获得文件句柄 头文件: #include 定义函数: FILE * freopen(const char * path, const char * mode, FILE * stream); 函数说明: 参数 path 字符串包含欲打开的文件路径及文件名。 参数mode 请参考fopen()说明.。 参数stream 为已打开的文件指针. Freopen()会将原stream 所打开的文件流关闭, 然后打开参数path 的文件。 返回值:文件顺利打开后, 指向该流的文件指针就会被返回. 如果文件打开失败则返回NULL,

fscanf返回值被忽略怎么解决_首页高可用解决方案

使用场景在开发大型项目的时候经常会出现并发导致的服务器崩溃问题,特别是首页,作为流量的入口非常容易遇到大量的流量进行冲击,为了防止这种问题出现。对于这种问题一般可以使用页面静态化+Nginx或网关限流+缓存预热等一系列操作来减轻服务器压力,这篇文章讲得就是Nginx限流+redis缓存预热来解决首页并发过高的问题。技术选型根据二八定理,大部分的流量都会停留在小部分页面,例如首页、产品详情页等,而t...

weixin_39717598的博客 484

逆向实战:Soul聊天协议加密与Frida绕过检测

本文详细解析了Soul聊天协议逆向分析的全过程,重点介绍了如何利用Frida绕过应用的反调试检测机制。通过静态分析定位关键SO库,并编写Frida脚本动态Hook线程创建函数,成功实现对抗。文章还进一步追踪了基于DES算法的加密流程,并探讨了协议数据结构的解析方法,为移动应用安全研究提供了实战参考。

2w3e4r5t6y的博客 1133

SpringBoot+VUE3实战:如何用WebSocket搞定网页端语音通话(避坑指南)

本文详细介绍了如何使用SpringBoot和VUE3结合WebSocket技术实现网页端语音通话功能。从环境配置、WebSocket服务端实现到前端音频处理,提供了完整的开发指南和避坑建议,帮助开发者快速构建稳定高效的实时语音通信系统。

weixin_29021195的博客 221

freopen

本文转自:http://www.cnblogs.com/moonlit/archive/2011/06/12/2078712.html   当我们求解acm题目时,通常在设计好算法和程序后,要在调试环境(例如VC等)中运行程序,输入测试数据,当能得到正确运行结果后,才将程序提交到oj中。但由于调试往往不能一次成功,每次运行时,都要重新输入一遍测试数据,对于有大量输入数据的题目,输入数据需要花费

风雨无阻 http://blog.youkuaiyun.com/ShineOrRain 1075

奥比中光Gemini335L SDK实战:从标定参数到3D点云转换

本文详细介绍了奥比中光Gemini 335L深度相机的SDK实战应用,重点讲解如何跳过繁琐的棋盘格标定,直接调用出厂预标定参数实现高效的3D点云转换。通过解析内参、外参获取及四种核心坐标转换模式,并结合OpenCV等工具,指导开发者快速将相机集成到机器人抓取、三维测量等项目中,实现开箱即用的3D视觉解决方案。

raspberrypi5的博客 639

freopen重定向函数

函数名:freopen 声明:FILE *freopen( const char *path, const char *mode, FILE *stream ); 所在文件: stdio.h 参数说明: path: 文件名。 mode: 文件打开的模式。和fopen中的模式(如r, w,)相同。 stream: 一个文件,通常使用标准流文件(stdin, stdout, stderr)

嗯.的专栏 2268

【RK3399 Ubuntu】基于rk3399的lxde的lubuntu桌面移植适配记录之第二步:最基本Ubuntu根文件系统的相关常用工具完善

文章目录1.使能系统网络管理服务1.1 安装驱动modules管理工具1.2 使能网络服务2.终端自动补全命令功能3.安装ssh服务4.安装系统信息查看工具5.安装resize工具6.安装lrzsz工具7.使能rc.local服务7.1 修改服务Install块7.2 使能rc.local.service服务7.3 添加执行脚本且赋予执行权限 续接上文,本文主要完善前面已经制作好的rootfs 1.使能系统网络管理服务 1.1 安装驱动modules管理工具 apt-get install kmod 1.

wang 恒 的博客 1387

基于Simulink实现电动汽车制动能量回收系统的仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车制动能量回收系统的仿真研究。该系统能够全面评估制动能量回收系统的性能,验证控制策略的有效性,并通过优化设计提高能量回收效率和制动安全性。引入智能预测:结合人工智能技术,实现更智能的能量回收控制策略。扩展功能:增加对多种车型和制动场景的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 336

python中装饰器修复技术_终于解决了使用Python装饰器中的一个痛点

前言如何给装饰器的参数传参,这个问题曾经困扰我好久,虽然Python版本的更新,现在这个问题终于解决了,特此记录。疑问首先我有一个这样的装饰器文件路径helper/log_helper.pyimporttracebackfromfunctoolsimportwrapsfromloguruimportloggerdefmy_logger(count):defstep1(foo):@...

weixin_39956009的博客 134

【GlobalMapper精品教程】006:Excel表格(.xls)或文本(.txt .csv)坐标文件生成矢量点

原始的坐标数据如下图所示,其中坐标为Lat经度,LNG纬度,均为十进制度的形式,一般软件都支持十进制度的格式,如果不支持,你可以尝试使用度分秒的形式,图中的DDMMSS-LAT为纬度,DDMMSS-LNG为经度。打开globalmapper软件,点击【打开数据文件】,选择坐标数据文件(案例中的数据位配套实验数据包中的data006.rar)气象台站分布点坐标.xls。选择坐标系:本案例数据采用的是经纬度,因此选择Geographic(Latitude/Longitude),基准选择WGS84,点击确定。

智慧空间实验室 2570

python装饰设备,终于解决了使用Python装饰器中的一个痛点,

终于解决了使用Python装饰器中的一个痛点,前言如何给装饰器的参数传参,这个问题曾经困扰我好久,虽然Python版本的更新,现在这个问题终于解决了,特此记录。疑问首先我有一个这样的装饰器文件路径helper/log_helper.pyimporttracebackfromfunctoolsimportwrapsfromloguruimportloggerdefmy_logger(...

weixin_39821035的博客 119

损失函数大汇总(四十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的边界优化损失函数,特别适用于小目标、细长结构和类别不平衡场景。它通过引入真实边界的有符号距离场(SDF),将边界距离优化问题转化为区域积分形式。与Dice Loss等区域重叠损失不同,Boundary Loss更关注预测边界与真实边界的精确对齐,而非整体区域重叠。其核心公式为像素级SDF值与预测概率的乘积求和,通过梯度调整使预测概率在真实边界内部升高、外部降低。该损失通常与区域型损失(如CE或Dice)联合使用,形成"区域分割+边界修正&qu

悦学共鸣,温柔以待,汇聚光芒,共同成长 354

PostgreSQL 实战:行级安全策略(RLS)详解

PostgreSQL的行级安全(RLS)机制实现了细粒度的数据访问控制,通过动态过滤行数据满足多租户隔离、隐私保护等需求。本文系统介绍了RLS的核心原理、配置方法及实践建议:1) 启用RLS后需定义策略,通过USING和WITH CHECK条件控制访问;2) 适用于SaaS、医疗金融等场景,但需注意COPY命令、外键等特殊情况;3) 建议配合会话变量、索引优化和文档化策略使用。文章还提供了多租户隔离等实战案例,并分析了RLS对查询性能的影响及优化方案。RLS将安全控制下沉至数据库层,显著提升应用安全性和可维

数据知道的博客 3153

Python中的 装饰器

在阐述什么是装饰器前,我们先来说一下什么是闭包 闭包: 在一个外函数中 定义了一个内函数 内函数运用了 外函数的临时变量 外函数的返回值 是内函数的引用 def outer( ): a=100 def inner( ): b=a+100 print(b) return inner outer( )( ) 装饰器: 以@开头,装饰器是在函数调

ZPeng_Yan的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python装饰器副作用_终于解决了使用Python装饰器中的一个痛点

前言如何给装饰器的参数传参,这个问题曾经困扰我好久,虽然Python版本的更新,现在这个问题终于解决了,特此记录。疑问首先我有一个这样的装饰器文件路径helper/log_helper.pyimporttracebackfromfunctoolsimportwrapsfromloguruimportloggerdefmy_logger(count):defstep1(foo):@...

weixin_39863161的博客 98

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

fscanf返回值被忽略怎么解决_终于解决了使用Python装饰器中的一个痛点

点击上方“Python学习开发”,选择“加为星标”第一时间关注Python技术干货!前言 如何给装饰器的参数传参,这个问题曾经困扰我好久,虽然Python版本的更新,现在这个问题终于解决了,特此记录。疑问 首先我有一个这样的装饰器文件路径helper/log_helper.pyimporttracebackfromfunctoolsimportwrapsfromlogurui...

weixin_39569112的博客 258

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Python装饰器的使用详解

在函数嵌套的前提下,内部函数使用外部函数的变量,并且外部函数返回内部函数我们把这个使用外部函数变量的内部函数称为闭包。

lIujunXHU的博客 2711

python中的装饰器的使用实战

1、装饰器的理解 装饰器是将一个函数镶嵌在另一个函数中进行重复使用的目的,不改变其结构,增加函数的使用方式,但是不用写过多冗余的代码; 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。 通常用到的功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存 2、...

God丶Davide的博客 8万+

Python中的装饰器

装饰器是Python中一种强大的工具,它允许在不修改原函数代码的情况下为其添加额外功能(如日志记录、性能分析等)。装饰器基于函数是一等对象的概念,可以作为参数传递或返回嵌套函数。通过@语法糖可以简化装饰器的使用,而functools.wraps能保留原函数的元信息。此外,装饰器本身也可以接受参数,通过多层嵌套实现更灵活的功能扩展。装饰器能有效减少重复代码,提高代码可读性和复用性。

weixin_42206119的博客 1310

Python中的装饰器是什么?

在Python的世界里,装饰器是一种非常强大而优雅的工具,它允许程序员在不修改原有函数代码的前提下,增加函数的功能。

Trb601012的博客 1220
上一篇: 如何建立一个完美的 Python 项目?
下一篇: 利用Python爬虫完美采集1688商品数据!
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值