Pythonでメソッドをパラメーターとして渡す方法


191

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

self.method2(self.method1)

def method1(self):
    return 'hello world'

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

回答:


263

はい、そうです、あなたが書いたように、メソッドの名前を使用してください。メソッド/関数は、他のものと同じように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_argumentskeyword_argumentsmethod1


34

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

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

foo = Foo()
foo.method2(foo.method1)

1
インスタンスがない場合はfooどうなりますか?
Lei Yang

1
次に、単にfooは必要ありません。例: def method1(): pass def method2(method) return method() method2(method1)
Tom

14

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

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()

6

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

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

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

foo(bar)

出力:

Running parameter f().
In bar().

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


5

クラスのメソッドを引数として渡したいが、それを呼び出すオブジェクトがまだない場合は、最初の引数(つまり「自己」)として受け取ったオブジェクトを単に渡すことができます。引数)。

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」と印刷されます


5

良い答えはたくさんありますが、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

これは、ここで述べた他の答えよりもはるかにきれいだと思います。


これがディクショナリの値である場合、関数オブジェクトを返すのではなく、どのように実行できますか?編集:()戻り呼び出しのオブジェクトの最後に置くことができることに気づいたところです。
vaponteblizzard

3

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


0

正確にはあなたが望むものではありませんが、関連する便利なツールは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')()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.