千家信息网

如何解决使用Python装饰器出现的问题

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"如何解决使用Python装饰器出现的问题",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何解决使用Python装饰器出现的问题"吧
千家信息网最后更新 2026年11月01日如何解决使用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安全错误 数据库的锁怎样保障安全 保险科技 互联网保险 互联网是不是新科技 中国互联网科技发展 南京欣网互联网科技 成都仁贤领冠互联网科技有限公司 创业天下互联网科技有限公司 宝灵互联网科技有限公司 国大互联网教育科技有限公司工作 南博望互联网科技有限公司 卓翼科技产业互联网合作 华中科技大学互联网的牛人 宁波跨境商互联网科技有限公司 上海同邻互联网科技有限公司规模 同城互联网络科技 中国互联网公司的科技投入 求路客互联网科技电话 马化腾互联网科技教学 科技互联网公司两年变化 10位科技互联网大佬 如何强化互联网金融科技 互联网加科技 互联网科技工作委员会主任 互联网络科技有限公司 上海卓越科技 互联网 国外互联网科技网站 广西互联网科技孵化中心 天津腾达互联网科技有限公司 世界互联网领先科技成果获奖 厦门江牛科技互联网 互联网科技包装股
0