2009-04-01 21 views

risposta

124

Sì, è sufficiente utilizzare il nome del metodo, come è stato scritto. I metodi/le funzioni sono oggetti in Python, proprio come qualsiasi altra cosa, e puoi passarli nel modo in cui fai le variabili. In effetti, puoi pensare a un metodo (o funzione) come una variabile il cui valore è l'oggetto codice richiamabile effettivo.

FYI, non esiste un metodo call - mi pare si chiami __call__, ma non c'è bisogno di richiamare in modo esplicito:

def method1(): 
    return 'hello world' 

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

method2(method1) 
+1

Wow, sorprendentemente semplice. –

+1

@MattFletcher La semplicità di Python mi stupisce sempre (provenendo da C++). – GHC

+0

@David Z come posso passare gli argomenti nel metodo 1? – Geek

22

sì è possibile. Basta chiamarlo:

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

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

e se non ci fosse istanza 'pippo'? –

+0

Poi semplicemente non hanno bisogno di foo, per es .: 'def method1(): passaggio def method2 (metodo) metodo di ritorno() method2 (method1)' – Tom

5

Sì; funzioni (e metodi) sono oggetti di prima classe in Python. Le seguenti opere:

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

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

foo(bar) 

Uscite:

Running parameter f(). 
In bar(). 

Questi tipi di domande sono banali per rispondere utilizzando l'interprete Python o, per più funzioni, la shell IPython.

10

Ecco il vostro esempio riscritto per mostrare un esempio di lavoro autonomo:

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

I metodi sono oggetti come qualsiasi altro. Così puoi passarli in giro, memorizzarli in liste e dict, fare quello che vuoi con loro. La cosa speciale su di loro è che sono oggetti chiamabili in modo da poter invocare __call__ su di essi. __call__ viene chiamato automaticamente quando si richiama il metodo con o senza argomenti, quindi è sufficiente scrivere methodToRun().

Problemi correlati