2011-01-03 14 views
7

मैं इस मुद्दे जहां मैं गतिशील समारोह जो कुछ डेटाबेस से लिया गया मूल्यों के आधार पर गणना करना होगा बनाना चाहते हैं, मैं अपने आंतरिक गणना लेकिन कैसे गतिशील वर्ग बनाने के लिए सवाल के साथ स्पष्ट कर रहा हूँ है:पायथन: बनाने गतिशील कार्यों

मेरे संरचना कुछ इस तरह है:

class xyz: 

    def Project(): 

     start = 2011-01-03 

     def Phase1(): 
      effort = '2d' 
     def Phase2(): 
      effort = '3d' 
     def Phase3(): 
      effort = '4d' 

अब गतिशील रूप से उन सभी PhaseX() फ़ंक्शन उत्पन्न करना चाहते हैं तो किसी भी एक मुझे का सुझाव कैसे अजगर कोड

प्रतीक्षा का उपयोग कर इस तरह बात कर सकते हैं प्राप्त करने के लिए सकारात्मक उत्तर सम्मान धन्यवाद

उत्तर

26

closures के साथ।

def makefunc(val): 
    def somephase(): 
    return '%dd' % (val,) 
    return somephase 

Phase2 = makefunc(2) 
Phase3 = makefunc(3) 

caveats

1

यह उत्तर माना जा सकता है कि आपके इरादे बहुत सरल हैं, लेकिन ऐसा प्रतीत होता है जैसे आप विशेष फ़ंक्शन कॉल के लिए मूल्य निर्धारित करना चाहते हैं।

क्या आप निम्न की तरह कुछ मानेंगे?

def setEffort(n): 
    effort = str(n)+'d' 
0

आप पाइथन कक्षा गतिशील या मेटाक्लास बनाने के लिए प्रकार फ़ंक्शन का उपयोग कर सकते हैं।

myDynamicClassWithDynamicFunctions = type('ClassName', (object,), { 
    'phase1': aFunction, 
    'phase2': anotherFunction, 
    ....}) 

तर्क टाइप करने के लिए कर रहे हैं:: बीमार पहली विधि का वर्णन वर्ग के नाम, वर्ग ठिकानों (एक टपल के रूप में), वर्ग एक dict में जिम्मेदार बताते हैं। बेशक, आप इन पैरामीटर को प्रोग्रामेटिक रूप से अपनी इच्छानुसार बना सकते हैं।

1

मैं हाल ही में यह एक ही मुद्दे के साथ संघर्ष किया, और मैं मैं क्या मेरे लिए काम करने के लिए ... मूल उदाहरण का उपयोग कर पाया लिख ​​करना चाहता था। पहले के जवाब से अंतर यह है कि मैं फ़ंक्शन नाम (कक्षा के हिस्से के रूप में) बनाने के लिए सेटैटर का उपयोग कर रहा हूं।

class xyz(object): 
    def __init__(self): 
     # I wasn't clear how you were using effort...like this? 
     self.effort = '0d' 
    def add_phases(self, phase_dict): # Take a dictionary of phases and values 
     for phase, value in phase_dict.items(): 
      self.make_phase(phase, value) 
    def make_phase(self, phase, value): 
     def somephase(self): # Create a closure like @Ignacio 
      self.effort = str(value) + 'd' 
     setattr(self.__class__, "Phase" + str(phase), somephase) 

tracker = xyz() 
phases = {1:2, 2:1, 3:6, 4:2} 
tracker.add_phases(phases) 
tracker.Phase3() 
assert tracker.effort == '6d' 
संबंधित मुद्दे