たとえば、私は
class A:
def f(self, x, y, z):
# do something with x, y, z
「self、x、y、z」を再入力せずに f をオーバーライドすることは可能ですか? 基本的に、10個の引数を持つ関数を持つクラスがあり、それを拡張する多くのクラスを持つつもりなので、毎回引数を入力したくない. すべての引数のリスト/辞書を渡すように言わないでください。
いいえ。オーバーライドされた関数に同じ引数を持たせたい場合は、同じ引数を入力する必要があります。オーバーライドして異なる引数を持つことができるため、同じ引数を持ちたいことを魔法のように知る方法はありません。
これを回避する唯一の方法は*args
and/orを使用する**kwargs
ことですが、それをしたくないと言っているようです。(また、間違った引数で呼び出した場合にどこで/いつエラーが発生するかという点で、これは実際に正しい引数で関数を定義することとまったく同じではありません。)
class A:
def facade_f(self, x, y, z):
self._real_f({'x': x, 'y': y, 'z': z})
def _real_f(self, params):
# do something with params['x'], params['y'], params['z']
class B(A):
def _real_f(self, params):
# do something with params['x'], params['y'], params['z']
これは真のオーバーライドではありませんが、すべての名前付きパラメーターを備えた適切なインターフェイスを公開し、メソッドでそれらの型と値を確認でき、facade_f
拡張時にほとんど型を入力しません。
作業例:
class A:
def facade_f(self, x, y, z):
self._real_f({'x': x, 'y': y, 'z': z})
class B(A):
def _real_f(self, params):
print params['x'], params['y'], params['z']
B().facade_f(1, 2, 3)