加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在Python中,是否可以使用相同的装饰器来装饰类和非类方法?

发布时间:2020-12-20 12:29:06 所属栏目:Python 来源:网络整理
导读:我有一个简单的异常日志记录装饰器,当我的脚本抛出异常时,它可以方便地发送自己的电子邮件. def logExceptions(func): def wrapper(): try: func() except Exception,e: logger.exception(e) return wrapper 但是,如果我想装饰一个类方法,我必须修改wrapper(
我有一个简单的异常日志记录装饰器,当我的脚本抛出异常时,它可以方便地发送自己的电子邮件.

def logExceptions(func):
   def wrapper():
      try:
         func()
      except Exception,e:
         logger.exception(e)

   return wrapper

但是,如果我想装饰一个类方法,我必须修改wrapper()以获取’self’,否则我会收到以下错误:

TypeError: wrapper() takes no arguments (1 given)

当然,在那一点上我不能用它来装饰任何非类方法,因为这样会发生这样的错误:

TypeError: wrapper() takes exactly 1 argument (0 given)

有没有一个干净的方法来解决这个问题?谢谢=)

解决方法

通常的做法是定义你的包装器,使它接受* args和** kwargs并将它们传递给它包装的函数.这样它就可以包装任何函数.

另外,我得到的印象是你所谓的“类方法”是Python所谓的“实例方法”,而你所谓的“非类方法”就是Python所谓的“函数”. Python中的“非类方法”(例如,实例方法)采用自参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读