2009-04-01 16 views

Respuesta

124

Sí, así es, simplemente use el nombre del método, como lo ha escrito. Los métodos/funciones son objetos en Python, como cualquier otra cosa, y puedes pasarlos por la forma en que haces 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.

FYI, no hay ningún método call - Creo que se llama __call__, pero usted no tiene que invocar explícitamente:

def method1(): 
    return 'hello world' 

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

method2(method1) 
+1

Guau, sorprendentemente simple. –

+1

@MattFletcher La simplicidad de Python siempre me sorprende (viene de C++). – GHC

+0

@David Z ¿cómo paso los argumentos en el método 1? – Geek

22

sí es posible. Simplemente llámelo:

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

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

¿Qué pasa si no hay una instancia 'foo'? –

+0

Entonces sólo tiene que no necesita foo, ej .: ' metodo1 def(): pase def metodo2 (método) método de retorno() metodo2 (metodo1)' – Tom

5

Sí; funciones (y métodos) son objetos de primera clase en Python. Las siguientes obras:

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

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

foo(bar) 

Salidas:

Running parameter f(). 
In bar(). 

este tipo de preguntas son triviales para responder utilizando el intérprete de Python o, para más características, la cáscara IPython.

10

Aquí está su ejemplo de re-escrito para mostrar un ejemplo de trabajo autónomo:

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

Los métodos son objetos como cualquier otro. Entonces puede pasarlos, almacenarlos en listas y dictados, hacer lo que quiera con ellos. Lo especial de ellos es que son objetos invocables, por lo que puede invocar __call__ en ellos. __call__ se llama automáticamente cuando se invoca el método con o sin argumentos, por lo que solo debe escribir methodToRun().

Cuestiones relacionadas