1

たとえば、私は

class A:
    def f(self, x, y, z):
        # do something with x, y, z

「self、x、y、z」を再入力せずに f をオーバーライドすることは可能ですか? 基本的に、10個の引数を持つ関数を持つクラスがあり、それを拡張する多くのクラスを持つつもりなので、毎回引数を入力したくない. すべての引数のリスト/辞書を渡すように言わないでください。

4

2 に答える 2

4

いいえ。オーバーライドされた関数に同じ引数を持たせたい場合は、同じ引数を入力する必要があります。オーバーライドして異なる引数を持つことができるため、同じ引数を持ちたいことを魔法のように知る方法はありません。

これを回避する唯一の方法は*argsand/orを使用する**kwargsことですが、それをしたくないと言っているようです。(また、間違った引数で呼び出した場合にどこで/いつエラーが発生するかという点で、これは実際に正しい引数で関数を定義することとまったく同じではありません。)

于 2012-11-22T04:07:28.667 に答える
1
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)
于 2012-11-22T04:15:19.067 に答える