232

メソッドにパラメータとしてメソッドを渡すことは可能ですか?

self.method2(self.method1)

def method1(self):
    return 'hello world'

def method2(self, methodToRun):
    result = methodToRun.call()
    return result
4

9 に答える 9

309

はい、あなたが書いたように、メソッドの名前を使用してください。メソッドと関数は、他のものと同様に Python のオブジェクトであり、変数と同じように渡すことができます。実際、メソッド (または関数) は、値が実際の呼び出し可能なコード オブジェクトである変数と考えることができます。

メソッドについて尋ねられたので、次の例ではメソッドを使用していますが、以下のすべてが関数に同じように適用されることに注意してください (selfパラメーターがない場合を除く)。

渡されたメソッドまたは関数を呼び出すには、メソッド (または関数) の通常の名前を使用するのと同じ方法で、バインドされている名前を使用するだけです。

def method1(self):
    return 'hello world'

def method2(self, methodToRun):
    result = methodToRun()
    return result

obj.method2(obj.method1)

注:__call__()メソッドは存在すると思います。つまり、技術的には可能methodToRun.__call__()ですが、明示的に行うべきではありません。__call__()独自のコードから呼び出すのではなく、実装することを意図しています。

引数付きで呼び出したい場合はmethod1、少し複雑になります。method2に引数を渡す方法に関する少しの情報を記述して、method1それらの引数の値をどこかから取得する必要があります。たとえば、method11 つの引数を取ることになっている場合:

def method1(self, spam):
    return 'hello ' + str(spam)

method2次に、渡される1つの引数で呼び出すように書くことができます:

def method2(self, methodToRun, spam_value):
    return methodToRun(spam_value)

または、それ自体を計算する引数を使用します。

def method2(self, methodToRun):
    spam_value = compute_some_value()
    return methodToRun(spam_value)

これを、渡された値と計算された値の他の組み合わせに拡張できます。

def method1(self, spam, ham):
    return 'hello ' + str(spam) + ' and ' + str(ham)

def method2(self, methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham_value)

またはキーワード引数を使用しても

def method2(self, methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham=ham_value)

method2を書いているときにどの引数が取られるかわからない場合はmethodToRun、引数のアンパッキングを使用して一般的な方法で呼び出すこともできます。

def method1(self, spam, ham):
    return 'hello ' + str(spam) + ' and ' + str(ham)

def method2(self, methodToRun, positional_arguments, keyword_arguments):
    return methodToRun(*positional_arguments, **keyword_arguments)

obj.method2(obj.method1, ['spam'], {'ham': 'ham'})

この場合positional_arguments、リストまたはタプルまたは類似のものである必要がkeyword_argumentsあり、辞書または類似のものです。では、 を呼び出す前にandmethod2を変更できます(たとえば、特定の引数を追加または削除したり、値を変更したりするなど) 。positional_argumentskeyword_argumentsmethod1

于 2009-04-01T18:09:03.977 に答える
38

はい、可能です。それを呼び出すだけです:

class Foo(object):
    def method1(self):
        pass
    def method2(self, method):
        return method()

foo = Foo()
foo.method2(foo.method1)
于 2009-04-01T18:11:42.707 に答える
16

スタンドアロンの動作例を示すために書き直した例を次に示します。

class Test:
    def method1(self):
        return 'hello world'

    def method2(self, methodToRun):
        result = methodToRun()
        return result

    def method3(self):
        return self.method2(self.method1)

test = Test()

print test.method3()
于 2009-04-01T18:13:07.820 に答える
8

はい; 関数 (およびメソッド) は、Python のファースト クラス オブジェクトです。以下の作品:

def foo(f):
    print "Running parameter f()."
    f()

def bar():
    print "In bar()."

foo(bar)

出力:

Running parameter f().
In bar().

これらの種類の質問は、Python インタープリターを使用するか、より多くの機能についてはIPythonシェルを使用して簡単に答えることができます。

于 2009-04-01T18:11:47.277 に答える
4

メソッドは、他のオブジェクトと同様にオブジェクトです。したがって、それらを渡したり、リストや辞書に保存したり、好きなことをしたりできます。それらの特別な点は、呼び出し可能なオブジェクトであるため、呼び出すことができることです__call____call__は、引数の有無にかかわらずメソッドを呼び出すと自動的に呼び出されるため、記述するだけで済みますmethodToRun()

于 2009-04-01T18:14:52.980 に答える