Wie gebe ich eine Methode als Parameter in Python
-
22-08-2019 - |
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
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.