メソッドにパラメータとしてメソッドを渡すことは可能ですか?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
メソッドにパラメータとしてメソッドを渡すことは可能ですか?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
はい、あなたが書いたように、メソッドの名前を使用してください。メソッドと関数は、他のものと同様に 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
それらの引数の値をどこかから取得する必要があります。たとえば、method1
1 つの引数を取ることになっている場合:
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_arguments
keyword_arguments
method1
はい、可能です。それを呼び出すだけです:
class Foo(object):
def method1(self):
pass
def method2(self, method):
return method()
foo = Foo()
foo.method2(foo.method1)
スタンドアロンの動作例を示すために書き直した例を次に示します。
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()
はい; 関数 (およびメソッド) は、Python のファースト クラス オブジェクトです。以下の作品:
def foo(f):
print "Running parameter f()."
f()
def bar():
print "In bar()."
foo(bar)
出力:
Running parameter f().
In bar().
これらの種類の質問は、Python インタープリターを使用するか、より多くの機能についてはIPythonシェルを使用して簡単に答えることができます。
メソッドは、他のオブジェクトと同様にオブジェクトです。したがって、それらを渡したり、リストや辞書に保存したり、好きなことをしたりできます。それらの特別な点は、呼び出し可能なオブジェクトであるため、呼び出すことができることです__call__
。__call__
は、引数の有無にかかわらずメソッドを呼び出すと自動的に呼び出されるため、記述するだけで済みますmethodToRun()
。