覆盖继承类中抽象类的装饰器

时间:2014-12-09 18:46:27

标签: python abstract-class decorator python-decorators abc

所以这就是我所拥有的:

抽象类:

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”。

有人有任何建议吗?

1 个答案:

答案 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)