通过类装饰器访问类函数



我被一个实现问题卡住了。

class A(object):
"class a variables"

@execute
def worker(self):
try:
"do an ETL operation"
except Exception as e:
raise ETL exception

def letmehandleETLerrors(self):
pass

def letmehandleDataIntegrityErros(self):
pass

def letmehandleDataQualityErrors(self):
pass

def letmehandleDataUpdateErrors(self):
pass

def letmehandleDataDisplayErrors(self):
pass

我有一个类,在这个类中,它的一个方法叫做worker,它调用其他的方法来做一些数据处理。

我想要完成的是在我的应用程序中有一个集中的异常处理部分,我可以卸载所有的异常处理和post活动。我们有很多步骤和争论来验证数据,所以到处进行异常处理变得很乏味。因此,在一个名为someExternalFile的文件中,我定义了集中式异常处理,总结如下:

class ETL_EXCEPTION(Exception):
pass
class execute(object):
def __init__(self,*args,**kwargs):
pass

def __call__(self,f):
@wraps(f)
def wrapped_f(*args):
try:
r = f(*args)
except ETL_EXCEPTION as etlEX:
" i would like to call ClassA.letmehandleETLerrors()"
pass

所以基本上任何时候在其他类的任何地方引发异常,我希望这个装饰器路由到适当的处理程序,以顺利地进行post活动。这里的问题是,我试图找到一种方法来引用在装饰器范围内的f的类实例。我可以像这样获得对类的引用:

self.currentclass = f.__globals__[f.__qualname__.split('.')[0]]

但是当我做self.currentclass.letmehandleETLerrors时,它说letmehandleETLerrors需要一个名为self的位置参数,所以实际上它创建了一个ClassA的新实例,我在想。

这是可能的吗?或者我应该把这个包装器从类中取出,并将其定义为一个方法,并将类a传递给它?

结果修饰函数获得类型为ClassA的值作为其第一个参数,因此您可以使用它来访问leetmehandleETLerrors。考虑到executeA紧密相连,它也可以在类中定义:仅仅因为它不意味着它必须公开或作为实例方法使用。

class A:
"class a variables"

def _execute(f):
@wraps(f)
def wrapped_f(self, *args):
try:
r = f(self, *args)
except ETL_EXCEPTION as etlEX:
self.letmehandleETLerrors()
@_execute
def worker(self):
try:
"do an ETL operation"
except Exception as e:
raise ETL exception

def letmehandleETLerrors(self):
pass

def letmehandleDataIntegrityErros(self):
pass

def letmehandleDataQualityErrors(self):
pass

def letmehandleDataUpdateErrors(self):
pass

def letmehandleDataDisplayErrors(self):
pass

最新更新