フレームワークでは、フレームワークユーザーのサブクラスである基本クラスを提供したいことがよくあります。基本クラスは、基本クラスへの制御されたアクセスを提供します。これを実現する一つの方法は、接頭辞としてアンダースコアを追加することによって、例えば、異なる名前で実装されていない方法を提供することである。継承ツリーに子メソッドを複数回ラップする方法は?
class Base:
def method(self, arg):
# ...
result = self._method(arg)
# ...
return result
def _method(self, arg):
raise NotImplementedError
しかし、この方式では唯一の継承の1つのレベルで動作します。より多くのレベルでは、メソッド名の違いによって、何が起こっているのかを把握することが難しくなります。また、フレームワークの利用者は、彼が選択したベース・クラスに応じて異なる方法でオーバーライドすることがあります。
class Base:
def method(self, arg):
# ...
result = self._method_sub(arg)
# ...
return result
def _method_sub(self, arg):
raise NotImplementedError
class Intermediate(Base):
def _method_sub(self, arg):
# ...
result = self._method_sub_sub(arg)
# ...
return result
def _method_sub_sub(self, arg):
raise NotImplementedError
を基本メソッドは、子メソッドの戻り値にアクセスする必要があるときに、スーパーメソッドを呼び出すことは助けにはなりません。オブジェクトの向きに若干の欠陥があると感じ、子クラスにコールを転送できるようにするchild
キーワードがありません。どのような解決策がこの問題を解決するために存在する?
@FujiApple Pythonに最終的なメソッドがあるとしましょう。どのように子クラスにそれらの一部を実装させることができますか?私の例のメソッドは本当に最終的なものではありません。子クラスは動作を提供し、基本クラスはそれをラップします。基本メソッドは、引数や戻り値に振る舞いや範囲チェックを追加することがあります。 – danijar
私は質問を理解するのに苦労しています。私はあなたが望むものを知っているかもしれませんが、私は本当にわかりません: 'Base.method()'が 'Base.methodSub()'をラップし、 methodSub() 'の実装です。親 'Base.method()'は 'methodSub()'の子実装の前後の検証を行うことができます。それが正しいと思われる場合は、例をノックアップすることができます私は弓を切って誰かがそれを把握できるように:) – FujiApple
@FujiAppleまったく。しかし、 'Base'と' Intermediate'はどちらもフレームワークが提供する抽象クラスです。フレームワークユーザが 'Intermediate'を拡張するためには、クラスは' Intermediate.methodSubSub() 'を提供しなければなりません。フレームワークのユーザは、自分が選んだ基底クラスに応じて、異なるメソッドをオーバーライドする必要があるので、これはうまくありません。 – danijar