¿Es posible pasar un método como parámetro a un método?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
¿Es posible pasar un método como parámetro a un método?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
Sí lo es, solo use el nombre del método, como lo ha escrito. Los métodos / funciones son objetos en Python, como cualquier otra cosa, y puede pasarlos de la forma en que realiza las variables. De hecho, puede pensar en un método (o función) como una variable cuyo valor es el objeto de código invocable real.
Para su información, no hay ningún call
método, creo que se llama __call__
, pero no tiene que invocarlo explícitamente:
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
Si quisieras method1
ser llamado con argumentos, entonces las cosas se vuelven un poco más complicadas. method2
tiene que escribirse con un poco de información sobre cómo pasar argumentos method1
, y necesita obtener valores para esos argumentos de alguna parte. Por ejemplo, si method1
se supone que toma un argumento:
def method1(spam):
return 'hello ' + str(spam)
entonces podría escribir method2
para llamarlo con un argumento que se pasa:
def method2(methodToRun, spam_value):
return methodToRun(spam_value)
o con un argumento de que se calcula a sí mismo:
def method2(methodToRun):
spam_value = compute_some_value()
return methodToRun(spam_value)
Puede expandir esto a otras combinaciones de valores pasados y valores calculados, como
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)
o incluso con argumentos de palabras clave
def method2(methodToRun, ham_value):
spam_value = compute_some_value()
return methodToRun(spam_value, ham=ham_value)
Si no sabe, al escribir method2
, qué argumentos methodToRun
tomará, también puede usar el desempaquetado de argumentos para llamarlo de manera genérica:
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'})
En este caso positional_arguments
debe ser una lista o tupla o similar, y keyword_arguments
es un dict o similar. En method2
puede modificar positional_arguments
y keyword_arguments
(por ejemplo, agregar o eliminar ciertos argumentos o cambiar los valores) antes de llamar method1
.
Sí, es posible. Solo llámalo:
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)
Aquí está su ejemplo reescrito para mostrar un ejemplo de trabajo independiente:
fuente
Si; Las funciones (y métodos) son objetos de primera clase en Python. Los siguientes trabajos:
Salidas:
Este tipo de preguntas son triviales para responder usando el intérprete de Python o, para más funciones, el shell de IPython .
fuente
Si desea pasar un método de una clase como argumento pero aún no tiene el objeto sobre el que va a llamarlo, simplemente puede pasar el objeto una vez que lo tenga como primer argumento (es decir, el "yo" argumento).
Esto imprimirá "Hola Mundo"
fuente
Muchas buenas respuestas pero extraño que nadie haya mencionado el uso de una
lambda
función.Entonces, si no tienes argumentos, las cosas se vuelven bastante triviales:
Pero supongamos que tiene uno (o más) argumentos en
method1
:Entonces puedes simplemente invocar
method2
comomethod2(lambda: method1('world'))
.Encuentro esto mucho más limpio que las otras respuestas mencionadas aquí.
fuente
()
al final del objeto en mi llamada de regreso, duh.Los métodos son objetos como cualquier otro. Para que pueda pasarlos, almacenarlos en listas y dictados, hacer lo que quiera con ellos. Lo especial de ellos es que son objetos invocables para que pueda invocarlos
__call__
.__call__
se le llama automáticamente cuando invoca el método con o sin argumentos, por lo que solo necesita escribirmethodToRun()
.fuente
No es exactamente lo que desea, pero una herramienta útil relacionada es
getattr()
utilizar el nombre del método como parámetro.fuente