为了账号安全,请及时绑定邮箱和手机立即绑定

更改装饰器内的实例属性

更改装饰器内的实例属性

FFIVE 2021-05-30 11:18:38
我已经搜索过这个问题,但我没有找到我正在寻找的答案。基本上,我想在 try/except 子句中包装一个类构造函数,以便它忽略构造函数中的特定类型的错误(但无论如何都会记录和打印它们)。我发现这样做的最好方法是用装饰器包装我的方法,因为我想在其他类中做同样的事情,但我不想继续重复相同的 try/except 子句。但是,该对象必须记住构造函数中是否发生了异常(将其保存在该对象的布尔属性中),以便稍后该对象调用特定方法时可以使用该信息。所以,我尝试在这个片段中做类似的事情:def detectAndIgnoreErrors(fn):    def wrappedFunc(*args, **kwargs):        try:            fn(*args, **kwargs)            self.HasAnExceptionOccurredInInit = False        except KeyError as e:            self.HasAnExceptionOccurredInInit = True            # Log and print exception        except RuntimeError as e:            self.HasAnExceptionOccurredInInit = True            # Log and print exception    return wrappedFuncclass Foo(FooSuperclass):    @detectAndIgnoreErrors    def __init__(self):        # Do stuff that may raise exceptions        pass    def doStuff(self):        if self.HasAnExceptionOccurredInInit:            # Do stuff            pass        else:            # Do other stuff            passfooInstance = Foo()fooInstance.doStuff()这里的想法是让对象忽略构造函数中的错误,稍后在doStuff()调用该方法时,对象会记住是否发生了异常HasAnExceptionOccurredInInit并相应地调整其行为。但是,解释器说该self名称未定义(这很有意义,因为我试图在类范围之外访问它)。然后,我尝试将装饰器作为类成员放置,然后再尝试将其作为Foo的父类中的类成员放置,但是这些替代方法均无效。经过研究,我意识到装饰器是在定义时解决的,而不是在执行时解决的,因此self无法以这种方式使用,所以我不知道该如何解决这个问题。如果有人知道如何解决此问题(或者也许是更好的解决方案,而不是装饰器),将不胜感激。
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

包装的函数没有名为的参数self;如果您要假设fn是一种方法,则需要特别指定。


def detectAndIgnoreErrors(fn):

    def wrappedFunc(self, *args, **kwargs):

        try:

            fn(self, *args, **kwargs)

            self.HasAnExceptionOccurredInInit = False

        except KeyError as e:

            self.HasAnExceptionOccurredInInit = True

            # Log and print exception

        except RuntimeError as e:

            self.HasAnExceptionOccurredInInit = True

            # Log and print exception


    return wrappedFunc


查看完整回答
反对 回复 2021-06-01
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信