如何解决使用Python装饰器出现的问题
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要讲解了"如何解决使用Python装饰器出现的问题",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何解决使用Python装饰器出现的问题"吧
千家信息网最后更新 2025年11月08日如何解决使用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装饰器出现的问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
问题
参数
就是
学习
内容
外界
形式
思路
文件
可行
没什么
也就是
也就是说
代码
作用
信息
函数
可以通过
怎么办
情况
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
如何查看数据库剩余表空间
cod16网络安全级别
网络安全性用什么软件查
java在哪里查看数据库
如何实现高效的http服务器
服务器cpu现在有哪些
读计算机网络技术专业好吗
我的世界2b2t服务器怎么找基地
服务器一直掉线
车载软件开发教程
Java界面删除数据库信息
邮箱服务器备份
软件开发设备研发
山西云搜网络技术怎么样
天津招聘软件开发
中专报计算机网络技术怎么样
储存数据服务器销售方案
浪潮服务器 硬盘红灯
医学 外文 数据库
水果网络技术创作的原声
宁波美娘科技 软件开发
西安互联网科技公司在哪里
iis 服务器证书
网络安全为什么是第五空间
网络安全是什么内容
陕西万联同创网络技术有限公司
csgo官匹服务器
服务器怎么找到电源
理正数据库安装无响应
网络技术服务费结算