2013-03-05 3 views
5

मैं गतिशील वर्ग पीढ़ी कर रहा हूं कि "संकलित" समय पर स्थिर रूप से निर्धारित किया जा सकता है। सरल मामले है कि मैं अभी और अधिक या कम इस तरह दिखता है:पाइथन क्लास पीढ़ी के स्थायी कैशिंग परिणाम

class Base(object): 
    def __init__(self, **kwargs): 
     self.do_something() 

def ClassFactory(*args): 
    some_pre_processing() 
    class GenericChild(Base): 
     def __init__(self, **kwargs): 
      self.some_processing() 
      super(GenericChild, self).__init__(*args, **kwargs) 
    return GenericChild 

Child1 = ClassFactory(1, 'Child_setting_value1') 
Child2 = ClassFactory(2, 'Child_setting_value2') 
Child3 = ClassFactory(3, 'Child_setting_value3') 

आयात पर, पायथन दुभाषिया, बाईटकोड को संकलित करने के लिए तो अमल फ़ाइल (इस प्रकार पैदा Child1, Child2, और Child3) प्रति एक बार लगता है पायथन उदाहरण।

वहाँ एक रास्ता, अजगर बताने के लिए फ़ाइल को संकलित करने के एक बार यह अमल Child कक्षाएं खोल, तो संकलन कि pyc फ़ाइल में है, ताकि खोल केवल (यहां तक ​​कि अजगर स्क्रिप्ट के लगातार फांसी भर में एक बार होता है है)?

मेरे पास अन्य उपयोग के मामले हैं जो अधिक जटिल और विस्तृत हैं, इसलिए Child कक्षाओं को हाथ से लिखकर कारखाने से छुटकारा पाने के लिए वास्तव में एक विकल्प नहीं है। इसके अलावा, यदि संभव हो तो मैं अतिरिक्त प्रीप्रोसेसर चरण से बचना चाहता हूं (सी प्रीप्रोसेसर के साथ सी-स्टाइल मैक्रोज़ का उपयोग करना)।

उत्तर

1

नहीं, आपको इसके बजाय पायथन कोड जेनरेट करना होगा, जहां वे कक्षाएं इसके बजाय पाइथन कोड 'बेक्ड' हैं।

स्ट्रिंग टेम्पलेटिंग के कुछ रूपों का उपयोग करें जहां आप पाइथन स्रोत कोड उत्पन्न करते हैं, उन्हें .py फ़ाइलों में सहेजें, फिर उनको बाइटकंपाइल करें।

हालांकि, कक्षा पीढ़ी स्टार्टअप पर केवल एक बार होती है। क्या यह वास्तव में इन उत्पन्न करने के लिए बहुत बढ़िया लागत है?

+0

यह प्रति वर्ग की लागत नहीं लेता है, लेकिन मेरे पास ऐसे कई मामले हैं और अक्सर कई पाइथन उदाहरणों को विकसित करने की आवश्यकता है, इसलिए यह विशेष रूप से उच्च भार के तहत बढ़ता है (जिस स्थिति में प्रारंभिकता का थोक हो सकता है एक लघु चलने कार्यक्रम के लिए समय)। पाइथन कोड उत्पन्न करते समय एक टेम्पलेटिंग एंजिंग का उपयोग करने के लिए – CSTobey

+0

+1। – thebjorn

0

यदि बच्चे वर्गों को अलग करने की कोई वास्तविक आवश्यकता नहीं है और आप केवल उन विशेष सेटों के लिए 'मानक कॉन्फ़िगरेशन' रखना चाहते हैं, तो आप वहां ऑब्जेक्ट फैक्ट्री को कॉन्फ़िगरेशन के साथ एक क्लास बना सकते हैं। प्रत्येक उदाहरण सामान्य कॉन्फ़िगरेशन के साथ जेनेरिक चाइल्डर को थूकने में सक्षम होगा, पूरी तरह से कक्षाओं की रनटाइम पीढ़ी को छोड़कर (और इसके साथ जुड़े डीबगिंग सिरदर्द) को छोड़ देगा।

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