2012-04-16 14 views
17

Quiero pasar algo similar a un puntero de función miembro. Intenté lo siguiente.¿Cómo pasar la función de miembro como argumento en python?

class dummy: 
    def func1(self,name): 
     print 'hello %s' % name 
    def func2(self,name): 
     print 'hi %s' % name 

def greet(f,name): 
    d = getSomeDummy() 
    d.f(name) 

greet(dummy.func1,'Bala') 

salida esperada es hello Bala

Respuesta

19

dummy.func1 es unbound, y por lo tanto simplemente toma una explícita self argumento:

def greet(f,name): 
    d = dummy() 
    f(d, name) 

greet(dummy.func1,'Bala') 
+1

Gracias. por cierto, ¿qué es el método independiente? – balki

+1

Es un método que no tiene ningún objeto asociado. Para obtener más información, consulte [esta pregunta de stackoverflow] (http://stackoverflow.com/questions/114214/class-method-differences-in-python-bound-unbound-and-static) – phihag

1

se puede usar algo como esto:

class dummy: 
    def func1(self,name): 
     print 'hello %s' % name 
    def func2(self,name): 
     print 'hi %s' % name 
def greet(name): 
    d = dummy() 
    d.func1(name) 
greet('Bala') 

y esto funciona pe de forma efectiva: on codepad

+1

Sí, esto funciona, pero lo que soy intentar hacer es pasar la función miembro también como argumento. es decir, 'greet (dummy.func2, 'Bala')' también debería funcionar – balki

5

Dado que dummy es el nombre de la clase, dummy.fun1 está sin consolidar.

Como dijo phihag, se utiliza una instancia de dummy para unir el método:

def greet(f,name): 
    d = dummy() 
    f(d, name) 

greet(dummy.func1, 'Bala') 

Como alternativa, puede crear una instancia de dummy fuera del greet:

def greet(f,name): 
    f(name) 

my_dummy = dummy() 

greet(my_dummy.func, 'Bala') 

También es posible usar functools.partial:

from functools import partial 

def greet(f,name): 
    f(name) 

my_dummy = dummy() 

greet(partial(dummy.func1, my_dummy), 'Bala') 
Cuestiones relacionadas