2012-04-16 4 views
17

Я хочу передать что-то похожее на указатель функции-члена. Я попробовал следующее.Как передать функцию-член в качестве аргумента в 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') 

Ожидаемый выход hello Bala

ответ

19

dummy.func1 является unbound, и поэтому просто принимает явный self аргумент:

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

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

Спасибо. Кстати, что такое несвязанный метод? – balki

+1

Это метод, не связанный с ним объектом. Для получения дополнительной информации см. [Этот вопрос об использовании stackoverflow] (http://stackoverflow.com/questions/114214/class-method-differences-in-python-bound-unbound-and-static) – phihag

1

Вы можете использовать что-то вроде этого:

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') 

и это работает pe rfectly: on codepad

+1

Да, это работает, но что я пытаясь сделать это, нужно также передать функцию-член в качестве аргумента. i.e 'greet (dummy.func2, 'Bala')' также должен работать – balki

5

С dummy - это имя класса, dummy.fun1 несвязано.

Как сказал phihag, вы используете экземпляр dummy, чтобы связать метод:

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

greet(dummy.func1, 'Bala') 

В качестве альтернативы, вы можете создать экземпляр dummy за пределами greet:

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

my_dummy = dummy() 

greet(my_dummy.func, 'Bala') 

Вы также можете использовать functools.partial:

from functools import partial 

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

my_dummy = dummy() 

greet(partial(dummy.func1, my_dummy), 'Bala') 
Смежные вопросы