Czy można przekazać metodę jako parametr do metody?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
Czy można przekazać metodę jako parametr do metody?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
Tak, po prostu użyj nazwy metody, tak jak napisałeś. Metody / funkcje są obiektami w Pythonie, tak jak wszystko inne, i możesz przekazywać je w sposób, w jaki robisz zmienne. W rzeczywistości można myśleć o metodzie (lub funkcji) jako zmiennej, której wartością jest rzeczywisty obiekt kodu, który można wywołać.
Do Twojej wiadomości, nie ma call
metody - myślę, że się nazywa __call__
, ale nie musisz jej jawnie wywoływać:
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
Jeśli chcesz method1
zostać wywołany argumentami, sprawy stają się nieco bardziej skomplikowane. method2
musi być napisany z odrobiną informacji o tym, jak przekazywać argumenty method1
, i musi skądś uzyskać wartości dla tych argumentów. Na przykład, jeśli method1
ma przyjąć jeden argument:
def method1(spam):
return 'hello ' + str(spam)
wtedy możesz napisać, method2
aby to wywołać z jednym argumentem, który zostanie przekazany:
def method2(methodToRun, spam_value):
return methodToRun(spam_value)
lub z argumentem, że oblicza się:
def method2(methodToRun):
spam_value = compute_some_value()
return methodToRun(spam_value)
Możesz rozwinąć to do innych kombinacji przekazywanych wartości i obliczanych wartości, takich jak
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)
lub nawet z argumentami słów kluczowych
def method2(methodToRun, ham_value):
spam_value = compute_some_value()
return methodToRun(spam_value, ham=ham_value)
Jeśli nie wiesz, podczas pisania method2
, jakie argumenty methodToRun
chcesz wziąć, możesz również użyć rozpakowywania argumentów, aby wywołać je w ogólny sposób:
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'})
W takim przypadku positional_arguments
musi to być lista, krotka lub podobne i keyword_arguments
jest to dykt lub podobne. W method2
możesz zmodyfikować positional_arguments
i keyword_arguments
(np. Dodać lub usunąć niektóre argumenty lub zmienić wartości) przed wywołaniem method1
.
Tak to mozliwe. Po prostu nazwij to:
class Foo(object):
def method1(self):
pass
def method2(self, method):
return method()
foo = Foo()
foo.method2(foo.method1)
foo
?def method1(): pass def method2(method) return method() method2(method1)
Oto Twój przykład przepisany od nowa, aby pokazać samodzielny przykład działania:
źródło
Tak; funkcje (i metody) są obiektami pierwszej klasy w Pythonie. Następujące prace:
Wyjścia:
Na tego rodzaju pytania można łatwo odpowiedzieć za pomocą interpretera języka Python lub, w celu uzyskania większej liczby funkcji, powłoki IPython .
źródło
Jeśli chcesz przekazać metodę klasy jako argument, ale nie masz jeszcze obiektu, do którego chcesz ją wywołać, możesz po prostu przekazać obiekt, gdy masz go jako pierwszy argument (tzn. „Ja” argument).
Spowoduje to wydrukowanie „Hello World”
źródło
Wiele dobrych odpowiedzi, ale dziwne, że nikt nie wspomniał o użyciu
lambda
funkcji.Więc jeśli nie masz argumentów, sprawy stają się dość trywialne:
Ale powiedz, że masz jeden (lub więcej) argumentów w
method1
:Następnie możesz po prostu wywołać
method2
jakomethod2(lambda: method1('world'))
.Uważam, że jest to o wiele czystsze niż inne odpowiedzi tutaj wymienione.
źródło
()
na końcu obiektu w swoim wywołaniu zwrotnym, duh.Metody są obiektami jak każdy inny. Możesz je przekazywać, przechowywać na listach i dyktandach, robić z nimi co tylko zechcesz. Szczególną rzeczą w nich jest to, że są obiektami, które można wywoływać, więc możesz je wywoływać
__call__
.__call__
jest wywoływany automatycznie, gdy wywołujesz metodę z argumentami lub bez, więc wystarczy napisaćmethodToRun()
.źródło
Nie do końca to, czego chcesz, ale pokrewnym przydatnym narzędziem jest
getattr()
użycie nazwy metody jako parametru.źródło