回答:
はい、そうです、あなたが書いたように、メソッドの名前を使用してください。メソッド/関数は、他のものと同じようにPythonのオブジェクトであり、変数を実行する方法でそれらを渡すことができます。実際、メソッド(または関数)は、値が実際の呼び出し可能なコードオブジェクトである変数と考えることができます。
参考までに、call
メソッドはありません-と呼ばれていると思い__call__
ますが、明示的に呼び出す必要はありません。
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
method1
引数を指定して呼び出す場合、状況は少し複雑になります。method2
に引数を渡す方法についての情報を少し書かなければなりませんmethod1
、そしてどこかからそれらの引数の値を取得する必要があります。たとえば、method1
引数が1つであるとすると、
def method1(spam):
return 'hello ' + str(spam)
次に、method2
渡される1つの引数でそれを呼び出すように記述できます。
def method2(methodToRun, spam_value):
return methodToRun(spam_value)
または、それ自体が計算する引数を指定します。
def method2(methodToRun):
spam_value = compute_some_value()
return methodToRun(spam_value)
これを、渡された値と計算された値の他の組み合わせに拡張できます。
def method1(spam, ham):
return 'hello ' + str(spam) + ' and ' + str(ham)
def method2(methodToRun, ham_value):
spam_value = compute_some_value()
return methodToRun(spam_value, ham_value)
またはキーワード引数も
def method2(methodToRun, ham_value):
spam_value = compute_some_value()
return methodToRun(spam_value, ham=ham_value)
がわからない場合は、を書くときにmethod2
、どの引数methodToRun
を取るか、引数のアンパッキングを使用して一般的な方法で呼び出すこともできます。
def method1(spam, ham):
return 'hello ' + str(spam) + ' and ' + str(ham)
def method2(methodToRun, positional_arguments, keyword_arguments):
return methodToRun(*positional_arguments, **keyword_arguments)
method2(method1, ['spam'], {'ham': 'ham'})
この場合positional_arguments
、リストまたはタプルなどである必要keyword_arguments
があり、dictなどです。では、を呼び出す前にand method2
を変更できます(たとえば、特定の引数を追加または削除したり、値を変更したりするため)。positional_arguments
keyword_arguments
method1
はい、可能です。それを呼び出すだけです:
class Foo(object):
def method1(self):
pass
def method2(self, method):
return method()
foo = Foo()
foo.method2(foo.method1)
def method1(): pass def method2(method) return method() method2(method1)
クラスのメソッドを引数として渡したいが、それを呼び出すオブジェクトがまだない場合は、最初の引数(つまり「自己」)として受け取ったオブジェクトを単に渡すことができます。引数)。
class FooBar:
def __init__(self, prefix):
self.prefix = prefix
def foo(self, name):
print "%s %s" % (self.prefix, name)
def bar(some_method):
foobar = FooBar("Hello")
some_method(foobar, "World")
bar(FooBar.foo)
「Hello World」と印刷されます
良い答えはたくさんありますが、lambda
関数の使用について誰も言及していません。
したがって、引数がない場合、物事はかなり簡単になります。
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
しかし、次のように1つ(または複数)の引数があるとしmethod1
ます。
def method1(param):
return 'hello ' + str(param)
def method2(methodToRun):
result = methodToRun()
return result
その後、単にmethod2
として呼び出すことができますmethod2(lambda: method1('world'))
。
method2(lambda: method1('world'))
>>> hello world
method2(lambda: method1('reader'))
>>> hello reader
これは、ここで述べた他の答えよりもはるかにきれいだと思います。
()
戻り呼び出しのオブジェクトの最後に置くことができることに気づいたところです。
正確にはあなたが望むものではありませんが、関連する便利なツールはgetattr()
、メソッドの名前をパラメータとして使用することです。
class MyClass:
def __init__(self):
pass
def MyMethod(self):
print("Method ran")
# Create an object
object = MyClass()
# Get all the methods of a class
method_list = [func for func in dir(MyClass) if callable(getattr(MyClass, func))]
# You can use any of the methods in method_list
# "MyMethod" is the one we want to use right now
# This is the same as running "object.MyMethod()"
getattr(object,'MyMethod')()
foo
どうなりますか?