这就是我所拥有的:
抽象类:
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并尝试在继承的类中添加覆盖装饰器,虽然没有错误,但仍然没有打印“这里”。
有人有什么建议吗?
最佳答案
装饰器在定义类时应用于函数,它们的返回值替换它们装饰的函数。在定义 DataWrapper
类时,您无法再更改正在使用的装饰器。
与其使用装饰器,不如让装饰器委托(delegate)给子类可以覆盖的类上的另一个方法:
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)
关于python - 在继承类中重写抽象类的装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27386505/