2012-04-16 21 views
17

Tôi muốn chuyển một cái gì đó tương tự như một con trỏ hàm thành viên. Tôi đã thử những điều sau đây.Làm cách nào để truyền hàm thành viên làm đối số trong 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') 

sản lượng dự kiến ​​là hello Bala

Trả lời

19

dummy.func1unbound, và do đó chỉ đơn giản là lấy một rõ ràng self luận:

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

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

Cảm ơn. btw, phương pháp unbound là gì? – balki

+1

Đó là một phương pháp không có đối tượng liên quan đến nó. Để biết thêm thông tin, hãy tham khảo [câu hỏi ngăn xếp ngăn xếp này] (http://stackoverflow.com/questions/114214/class-method-differences-in-python-bound-unbound-and-static) – phihag

1

Bạn có thể sử dụng một cái gì đó như thế này:

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

và điều này hoạt động pe rfectly: on codepad

+1

Có công trình này nhưng những gì tôi cố gắng làm là để vượt qua chức năng thành viên cũng như một đối số. tức là 'chào (dummy.func2, 'Bala')' cũng nên hoạt động – balki

5

dummy là tên lớp, dummy.fun1 không bị ràng buộc.

Như phihag nói, bạn sử dụng một thể hiện của dummy để ràng buộc phương pháp:

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

greet(dummy.func1, 'Bala') 

Ngoài ra, bạn có thể nhanh chóng dummy ngoài greet:

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

my_dummy = dummy() 

greet(my_dummy.func, 'Bala') 

Bạn cũng có thể sử dụng functools.partial:

from functools import partial 

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

my_dummy = dummy() 

greet(partial(dummy.func1, my_dummy), 'Bala') 
Các vấn đề liên quan