2012-04-16 34 views
17

मैं किसी सदस्य फ़ंक्शन पॉइंटर के समान कुछ पास करना चाहता हूं। मैंने निम्नलिखित की कोशिश की।सदस्य फ़ंक्शन को पायथन में तर्क के रूप में कैसे पास किया जाए?

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

धन्यवाद। बीटीडब्ल्यू, अनबाउंड विधि क्या है? – balki

+1

यह एक तरीका है जिसमें इससे कोई वस्तु नहीं जुड़ी है। अधिक जानकारी के लिए, [यह स्टैक ओवरफ्लो प्रश्न] देखें (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') 

और यह पे काम करता है rfectly: on codepad

+1

हाँ यह काम करता है लेकिन मैं क्या हूं ऐसा करने का प्रयास सदस्य कार्य को भी तर्क के रूप में पास करना है। i.e 'नमस्कार (dummy.func2,' बाला ')' भी काम करना चाहिए – balki

5

चूंकि dummy कक्षा का नाम है, dummy.fun1 अनबाउंड है।

phihag के रूप में कहा, तुम विधि बाध्य करने के लिए dummy का एक उदाहरण का उपयोग करें:

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

greet(dummy.func1, 'Bala') 

वैकल्पिक रूप से, आप का दृष्टांत कर सकते हैं dummygreet के बाहर:

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') 
संबंधित मुद्दे

 संबंधित मुद्दे