super
Pythonでパイプラインを作成する方法を考えていました。ストリームに対して実行する必要のある一連の変換があり、それを実行するための良い方法は次のようなものだと思いました。
class MyBase(object):
def transformData(self, x):
return x
class FirstStage(MyBase):
def transformData(self, x):
y = super(FirstStage, self).transformData(x)
return self.__transformation(y)
def __transformation(self, x):
return x * x
class SecondStage(FirstStage):
def transformData(self, x):
y = super(SecondStage, self).transformData(x)
return self.__transformation(y)
def __transformation(self, x):
return x + 1
意図したとおりに機能しますが、繰り返される可能性があります。N個のステージがある場合transformData
、変更するのは現在のクラスの名前だけであるN個の同一のメソッドがあります。
この定型文を削除する方法はありますか?私はいくつかのことを試みましたが、結果は私がどのように機能するかを完全に理解していなかったことを私に証明しただけでしたsuper
。
私が欲しかったのは、メソッドのみを定義し、MROで上がるメソッド__transformation
を自然に継承し、そのクラスの「メソッド」を呼び出してから、結果に対して「現在のクラス」を呼び出すことでした。子クラスごとに新しい同一のものを定義することは可能ですか、それとも定義する必要がありますか?transformData
transformData
__transformation
transformData
私は、これがパイプラインを実装するための悪い方法であることに同意します。これは、はるかに単純な(そしてより明確な)スキームで行うことができます。これは、コードをあまり変更せずに既存のクラスからパイプラインを取得するために、既存のモデルに対して実行できる最小限の変更だと思いました。私はこれがそれを行うための最良の方法ではないことに同意します。それはトリックであり、トリックは避けるべきです。また、私はそれがどのように機能するかをよりよく理解する方法として考えましたsuper
。
Buuuut。好奇心から...上記のスキームでtransformData
繰り返しなしでそれを行うことは可能ですか?これは本当の疑いです。その中の呼び出しが現在のクラスで呼び出されるように変更されるtransformData
方法で継承するトリックはありますか?super
それは非常に不明瞭で、読めない、賢いお尻のトリックになるでしょう。知っている。しかし、それは可能ですか?