python - 在继承类中重写抽象类的装饰器

标签 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并尝试在继承的类中添加覆盖装饰器,虽然没有错误,但仍然没有打印“这里”。

有人有什么建议吗?

最佳答案

装饰器在定义类时应用于函数,它们的返回值替换它们装饰的函数。在定义 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/

相关文章:

python numpy polyfit 函数

python - 使用 mock 和 pytest 在 python 中模拟装饰器

python - 调用 Tornado 服务器时保持 ajax 调用处于事件状态

python - 尝试扩展行数据并转换为 DataFrame,出现此错误 : AttributeError: 'float' object has no attribute 'keys'

Python - 使用基类方法更新子属性

php - 从PHP5中的抽象方法访问类常量

ruby-on-rails - Ruby on Rails 中的手工装饰器。当 Drapper 造成的问题多于解决的问题时

angular - 避免 Angular 中的类选择器重复

python - 具有多维数组的外积

java - java中子类的实例化