2012-04-16 23 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.func1unboundであるため、単に明示的なself引数を取る:

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

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

ありがとうございます。 btw、アンバインドメソッドは何ですか? – balki

+1

これはオブジェクトが関連付けられていないメソッドです。詳細については、[this stackoverflow question](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

はいこれは動作しますが、私は何ですかメンバー関数を引数として渡すだけです。すなわちgreet(dummy.func2、 'Bala') 'も動作するはずです – balki

5

dummyは、dummy.fun1がバインドされていないためです。あなたはまた、functools.partialを使用することができ

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

my_dummy = dummy() 

greet(my_dummy.func, 'Bala') 

dummygreetのあなたはインスタンス化することができ、また

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

greet(dummy.func1, 'Bala') 

:phihagが言ったように

は、あなたが方法をバインドするdummyのインスタンスを使用

from functools import partial 

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

my_dummy = dummy() 

greet(partial(dummy.func1, my_dummy), 'Bala') 
関連する問題