所以这就是我所拥有的:
抽象类:
class DataWrapper(object):
def decorator(f):
def preprocess(*args, **kwargs):
return f(*args, **kwargs)
return preprocess
@decorator
def datamethod1(self, ..): ...
@decorator
def datamethod2(self, ..): ...
继承类:
class DataManipulation(DataWrapper):
def __init__(self, ..): ..
def decorator(f):
print 'here'
def preprocess(*args, **kwargs):
ret = f(*args, **kwargs)
return preprocess
基本上我有一堆通用数据方法(在DataWrapper中定义),它们被各种类使用。我允许定义一个装饰器,在返回之前对数据执行任何前/后处理,这在DataWrapper中定义为占位符。
不幸的是,当我尝试在继承的类中定义它时,装饰器没有被覆盖;即“此处”未被打印。
我看到this并尝试在继承的类中添加覆盖装饰器,虽然没有错误,但仍然没有打印“here”。
有人有任何建议吗?
答案 0 :(得分:3)
当定义类时,装饰器应用于函数,它们的返回值替换它们装饰的函数。在定义DataWrapper
类之后,您无法再更改正在使用的装饰器。
不要使用装饰器,而是将装饰器委托给子类可以覆盖的类上的另一个方法:
def method_process(f):
def wrapper(self, *args, **kwargs)
return self.process(f, *args, **kwargs)
class DataWrapper(object):
def process(self, f, *args, **kwargs):
# subclass to process the methods
return f(self, *args, **kwargs)
@method_process
def datamethod1(self, ..):
# ...
@method_process
def datamethod2(self, ..):
# ...
class DataManipulation(DataWrapper):
def process(self, f, *args, **kwargs):
print 'preprocessing here'
return super(DataManipulation, self).process(f, *args, **kwargs)