Frage

Ist es möglich, ein Verfahren als Parameter an eine Methode zu übergeben?

self.method2(self.method1)

def method1(self):
    return 'hello world'

def method2(self, methodToRun):
    result = methodToRun.call()
    return result
War es hilfreich?

Lösung

Ja, es ist, verwenden Sie einfach den Namen der Methode, wie Sie geschrieben haben. Methoden / Funktionen sind Objekte in Python, wie alles andere, und Sie können sie rund um die Art und Weise Sie Variablen tun passieren. In der Tat kann man über eine Methode denken (oder Funktion) als Variable, dessen Wert das tatsächliche aufrufbar Codeobjekt.

FYI, gibt es keine call Methode - Ich denke, es __call__ genannt wird, aber sie haben es nicht explizit aufrufen:

def method1():
    return 'hello world'

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

method2(method1)

Wenn Sie method1 wollte mit Argumenten aufgerufen werden, dann werden die Dinge ein wenig komplizierter. method2 muss mit einem wenig Informationen über geschrieben werden, wie Argumente zu übergeben method1, und es braucht Werte für diese Argumente von irgendwo zu bekommen. Zum Beispiel, wenn method1 soll ein Argument nehmen:

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

dann könnte man schreiben method2 es mit einem Argument zu nennen, die in übergeben wird:

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

oder mit dem Argument, dass es berechnet sich:

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

Sie können dies in und berechneten Werten übergeben zu anderen Kombinationen von Werten erweitern, wie

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)

oder auch mit Schlüsselwort-Argumenten

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

Wenn Sie nicht wissen, wenn method2 schreiben, welche Argumente methodToRun nehmen wird, können Sie es auch nennen in allgemeiner Weise verwenden Argument Auspacken:

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'})

In diesem Fall positional_arguments eine Liste oder Tupel oder ähnlich sein muss, und keyword_arguments ist ein dict oder ähnliches. In method2 Sie positional_arguments und keyword_arguments ändern können (zum Beispiel bestimmte Argumente hinzuzufügen oder zu entfernen oder die Werte ändern), bevor Sie rufen method1.

Andere Tipps

Ja, es ist möglich. Nur es nennen:

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

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

Hier ist Ihr Beispiel neu geschrieben ein eigenständiges zeigen Arbeitsbeispiel:

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

Ja; Funktionen (und Verfahren) sind erste Klassenobjekte in Python. Die folgenden Werke:

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

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

foo(bar)

Ausgänge:

Running parameter f().
In bar().

Diese Art von Fragen sind trivial, um weitere Funktionen mit dem Python-Interpreter oder zu beantworten, das IPython Shell.

Wenn Sie eine Methode einer Klasse als Argument übergeben wollen, aber noch nicht über das Objekt, auf dem Sie es gehen nennen, können Sie einfach das Objekt übergeben, wenn Sie es als erstes Argument (dh die "selbst" Argument).

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)

Dieses druckt "Hallo Welt"

Methoden sind Objekte wie jedes andere. So können Sie sie herum passieren, speichern sie in Listen und dicts, tun, was Sie mit ihnen mögen. Das Besondere an ihnen ist, sie sind aufrufbar Objekte, so dass Sie __call__ auf sie berufen kann. __call__ wird automatisch aufgerufen, wenn Sie die Methode mit oder ohne Argumente aufrufen, so dass Sie nur methodToRun() schreiben müssen.

Es gibt viele gute Antworten, aber merkwürdig, dass niemand eine lambda Funktion erwähnt werden.
Also, wenn Sie keine Argumente haben, die Dinge werden ziemlich trivial:

def method1():
    return 'hello world'

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

method2(method1)

Aber sagen, Sie haben eine (oder mehr) Argumente in method1:

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

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

Dann können Sie einfach method2 als method2(lambda: method1('world')) aufrufen.

method2(lambda: method1('world'))
>>> hello world
method2(lambda: method1('reader'))
>>> hello reader

Das finde ich viel sauberer als die anderen Antworten erwähnt hier.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top