python - 更改装饰器内的实例属性
问题描述
我已经搜索过这个问题,但我没有找到我正在寻找的答案。
基本上,我想在 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 wrappedFunc
class 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
pass
fooInstance = Foo()
fooInstance.doStuff()
这里的想法是让对象忽略构造函数中的错误,然后当doStuff()
调用该方法时,对象会记住是否发生异常HasAnExceptionOccurredInInit
并相应地调整其行为。但是,解释器说self
名称没有定义(这是有道理的,因为我试图在类范围之外访问它)。
然后,我尝试将装饰器作为类成员,然后我尝试将其作为类成员放在 Foo 的父类中,但这些替代方案都不起作用。
经过一番研究,我意识到装饰器是在定义时解决的,而不是在执行时解决的,所以没有办法self
这样使用,所以我不知道如何解决这个问题。
如果有人知道如何解决这个问题(或者可能是一个更好的解决方案而不是装饰器),那将不胜感激。
解决方案
包装函数没有名为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
推荐阅读
- android - Android Studio - 在不打开片段的情况下添加回栈
- gradle - 将 Spring Boot 项目添加到本地 Maven 存储库中
- csom - 如果企业资源池包含超过 1000 个资源,则 Project CSOM 无法添加新任务请求
- python - 使用opencv python读取模拟时钟图像并显示时间
- java - 如何在 Android 中设置 cookie 然后加载 url 以便该 url 域服务器读取 cookie
- asp.net-core-5.0 - 同一服务器上的 .NET Core 2.1 和 .NET Core 5.0 Web 应用
- python - 如何在pygame的标签中放置文本和变量
- c# - C# Razor 重定向到 .NetCore 5 中具有自定义路由的页面
- post - 如果登录 POST 请求中的凭据在没有加密的情况下可见,是否可以?
- jenkins - 如何从jenkins构建参数groovy设置环境变量