2010-10-12 17 views
19

मुझे गतिशील रूप से कक्षा बनाने की आवश्यकता है। भविष्य में विस्तार से जाने के लिए मुझे गतिशील रूप से Django के फॉर्म क्लास का सबक्लास बनाना होगा।गतिशील रूप से कक्षाएं बनाना - पायथन

गतिशील रूप से मैं उपयोगकर्ता द्वारा प्रदान की गई कॉन्फ़िगरेशन के आधार पर कक्षा बनाने का इरादा रखता हूं।


उदा।

मैं एक वर्ग CommentForm नामित जो फार्म वर्ग

उपवर्ग चाहिए वर्ग इस मामले में .... चुना गुण

की एक सूची है चाहिए

नाम = रूप। खरीफिल्ड()

टिप्पणी = forms.CharField (विजेट = forms.Textarea())


किसी भी उपयोगी सुझाव? :)

+0

"मुझे गतिशील रूप से कक्षा बनाने की आवश्यकता है।" इस प्रश्न को समझने के लिए आपको बहुत कम आवश्यकता है कि आपको ** ** बहुत अधिक जानकारी प्रदान करनी होगी। –

उत्तर

32

आप type में निर्मित, उचित तर्क गुजरते बुला, की तरह से मक्खी पर कक्षाएं बना सकता है:

CommentForm = type("CommentForm", (Form,), { 
    'name': forms.CharField(), 
    ... 
}) 

यह नई शैली वर्गों के साथ काम करता है। मुझे यकीन नहीं है, चाहे वह पुरानी शैली के वर्गों के साथ भी काम करे।

+1

यह पुरानी शैली के वर्गों के साथ काम करेगा जब तक कि वे एकमात्र बेस क्लास (एसएस) नहीं हैं। तो उदा। आप 'टाइप (नाम, (OldStyleClass, ऑब्जेक्ट), attrib_dict) कर सकते हैं' लेकिन नहीं 'टाइप (नाम, (OldStyleClass,), attrib_dict) '। यदि आपको परिणामी कक्षा की पुरानी शैली की आवश्यकता है, तो आप इसे अभी भी एक फ़ंक्शन में डालकर वर्ग निर्माण को पैरामीट्रिज़ कर सकते हैं, जैसे [इस उत्तर] (http://stackoverflow.com/questions/3915024/ गतिशील रूप से- क्रिएटिंग- क्लासेस -python/3915110 # 3915110)। – intuited

12

कक्षाएं लगभग कहीं भी परिभाषित की जा सकती हैं।

def newclass(val): 
    class C(object): 
    def __str__(self): 
     return str(val) 
    return C 

MyClass = newclass(5) 
m = MyClass() 
print str(m) 
+1

शायद कुछ पाठकों के लिए यह स्पष्ट नहीं है कि इस तकनीक का उपयोग 'सी' के लिए बेस क्लास सेट करने के लिए किया जा सकता है। यह उपयोगी है अगर आपको कुछ कारणों से गतिशील रूप से पुरानी शैली की कक्षा बनाने की आवश्यकता है। – intuited

+1

यदि आप कक्षा चर सेट करना चाहते हैं तो यह काम नहीं करता है – user178047

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