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 でプレースホルダーとして定義されています。

残念ながら、継承されたクラスでデコレータを定義しようとしても、デコレータはオーバーライドされません。つまり、「ここ」は印刷されていません。

これを見て、継承されたクラスにオーバーライドデコレータを追加しようとしましたが、エラーはありませんが、「ここ」はまだ出力されていません。

誰にも提案はありますか?

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 に答える