2011-03-18 12 views
30

मैं एक समारोह है कि यह तर्क से व्युत्पन्न वर्ग बनाता है:वर्ग नाम गतिशील रूप से कैसे सेट करें?

def factory(BaseClass) : 
    class NewClass(BaseClass) : pass 
    return NewClass 

अब जब मैं इसका इस्तेमाल नई कक्षाएं बनाने के लिए, वर्गों सभी एक ही नाम हैं, और उदाहरणों देखो की तरह वे एक ही प्रकार है:

NewA = factory(ClassA) 
NewB = factory(ClassB) 
print type(NewA()) # <class __main__.NewClass> 
print type(NewB()) # <class __main__.NewClass> 

क्या __name__ विशेषता मैन्युअल रूप से सेट करने के लिए उचित फ़िक्स है?

NewA.__name__ = 'NewA' 
print type(NewA()) # <class __main__.NewA> 

क्या कोई अन्य चीजें हैं जिन्हें मैं स्थापित कर रहा हूं, जबकि मैं इसमें हूं?

उत्तर

34

हां, __name__ सेटिंग करना सही काम है; आपको कक्षा के नाम को समायोजित करने के लिए कुछ भी सेट करने की आवश्यकता नहीं है।

उदाहरण के लिए:

def factory(BaseClass) : 
    class NewClass(BaseClass): pass 
    NewClass.__name__ = "factory_%s" % BaseClass.__name__ 
    return NewClass 

typeगलत यहाँ उपयोग करने के लिए बात है। यह आपको पाइथन के सामान्य वर्ग वाक्यविन्यास के साथ कक्षाओं को परिभाषित करने की अनुमति नहीं देता है, बल्कि आपको प्रत्येक वर्ग विशेषता को मैन्युअल रूप से सेट अप करने देता है। इसका उपयोग कक्षाओं से हाथ बनाने के लिए किया जाता है, उदाहरण के लिए। यदि आपके पास बेस क्लास की एक सरणी है और आप इसका उपयोग कर एक वर्ग बनाना चाहते हैं (जिसे आप पाइथन के क्लास सिंटैक्स के साथ नहीं कर सकते हैं)। इसे यहां इस्तेमाल न करें।

7

तीन तर्कों के साथ type() फ़ंक्शन का उपयोग करके देखें। निम्न कोड object के साथ बेस प्रकार के रूप में, और प्रारंभिक विशेषताओं के साथ एक नई कक्षा "न्यूए" बनाता है।

>>> type('NewA', (object,), {}) 
<class '__main__.NewA'> 
+0

यदि न्यू क्लास में कक्षा परिभाषा बहुत लंबी है तो थोड़ा सा गुंजाइश लगता है। मुझे सभी विधियों को एक शब्दकोश में जमा करना होगा (मुझे लगता है कि '' __doc __ '' के तहत, दस्तावेज़ स्ट्रिंग भी वहां जाती है)। – kiyo

+0

क्या भी अगर न्यू क्लास में विधियों को गतिशील रूप से बेस क्लास के तरीकों का संदर्भ देना है? – kiyo

+0

'टाइप' वैरिएबल बेस सूचियों वाले वर्ग बनाने जैसी चीजों के लिए है; यह पूरी तरह से गलत उपकरण है। –

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