1

所以这就是我所拥有的:

抽象类:

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 中定义为占位符。

不幸的是,当我尝试在继承的类中定义装饰器时,它并没有被覆盖;即“这里”没有被打印。

我看到了这个并尝试在继承的类中添加覆盖装饰器,虽然没有错误,'here' 仍然没有被打印出来。

有人有什么建议吗?

4

1 回答 1

4

定义类时将装饰器应用于函数,它们的返回值替换它们装饰的函数。在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)
于 2014-12-09T18:53:31.850 回答