Comment puis-je passer d'une méthode en tant que paramètre dans Python
Est-il possible de passer d'une méthode en tant que paramètre à une méthode?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
Vous devez vous connecter pour publier un commentaire.
Oui, il est, il suffit d'utiliser le nom de la méthode, comme vous l'avez écrit. Méthodes/fonctions sont des objets en Python, tout comme toute autre chose, et vous pouvez les passer autour de la façon dont vous faites des variables. En fait, vous pouvez penser à une méthode (ou fonction) comme une variable dont la valeur est le callable code objet.
Pour info, il n'y a pas de
call
méthode, je pense qu'il est appelé__call__
, mais vous n'avez pas à appeler explicitement:Si vous voulais
method1
être appelée avec des arguments, les choses deviennent un peu plus compliqué.method2
doit être écrit avec un peu d'informations sur la façon de passer des arguments àmethod1
, et il a besoin d'obtenir des valeurs pour les arguments de quelque part. Par exemple, simethod1
est censé prendre un seul argument:ensuite, vous pouvez écrire
method2
de l'appeler avec un argument qui est transmis:ou avec un argument qu'il calcule lui-même:
Vous pouvez étendre cela à d'autres combinaisons de valeurs passées et des valeurs calculées, comme
ou même avec le mot-clé arguments
Si vous ne savez pas, lors de l'écriture de
method2
, quels argumentsmethodToRun
va prendre, vous pouvez également utiliser l'argument du déballage à l'appeler de façon générique:Dans ce cas
positional_arguments
doit être une liste ou un tuple ou similaire, etkeyword_arguments
est un dict ou similaire. Dansmethod2
vous pouvez modifierpositional_arguments
etkeyword_arguments
(par exemple, d'ajouter ou de supprimer certains arguments ou de modifier les valeurs) avant d'appelermethod1
.def method1(arg1, arg2)
etdef method2(method, arg1, arg2)
Oui c'est possible. Il vous suffit d'appeler:
foo
?def method1(): pass def method2(method) return method() method2(method1)
Ici est votre exemple de ré-écrit pour montrer un stand-alone de travail exemple:
Oui; fonctions (méthodes) sont des objets de première classe en Python. Les ouvrages suivants:
Sorties:
Ces sortes de questions sont triviales pour répondre à l'aide de l'interpréteur Python ou, pour plus de fonctionnalités, le IPython shell.
Méthodes sont des objets comme les autres. De sorte que vous pouvez les transmettre autour de, de les stocker dans des listes et des dicts, faire ce que vous voulez avec eux. La chose de spécial à leur sujet est qu'ils sont remboursables les objets de sorte que vous pouvez invoquer
__call__
sur eux.__call__
est appelée automatiquement lorsque vous appelez la méthode avec ou sans arguments donc, vous avez juste besoin d'écriremethodToRun()
.Si vous souhaitez passer d'une méthode d'une classe comme un argument, mais n'ont pas encore l'objet sur lequel vous allez d'appeler, vous pouvez simplement passer de l'objet une fois que vous avez comme premier argument (c'est à dire le "soi" est un argument).
Cela print "Hello World"
Beaucoup de bonnes réponses, mais étrange que personne n'a mentionné l'aide d'un
lambda
fonction.Donc, si vous n'avez pas d'arguments, les choses deviennent assez trivial:
Mais dire que vous en avez un (ou plusieurs) des arguments en
method1
:Alors vous pouvez simplement appeler
method2
commemethod2(lambda: method1('world'))
.Je trouve cela beaucoup plus propre que les autres réponses mentionnées ici.