2010-08-16 12 views
6

हैलो स्टैक ओवरफ़्लो योगदानकर्ता,पैरामीटरयुक्त वर्ग और मेटाक्लास (कृपया पायथन में कोड उदाहरण) के बीच क्या अंतर है?

मैं एक नौसिखिया अजगर सीखने अभी प्रोग्रामर हूँ, और मैं this site जो वस्तु उन्मुख मानदंड समझाने में मदद करता है पर आया था। मुझे पता है कि metaclasses कक्षाओं के वर्ग हैं (जैसे मेटा-निर्देशिका निर्देशिकाओं की निर्देशिका आदि कैसे हैं), लेकिन मुझे कुछ परेशानी हो रही है: मेटाक्लास और पैरामीटरयुक्त वर्ग के बीच वास्तविक अंतर क्या है, के अनुसार वेबसाइट की परिभाषा?

यदि आप कर सकते हैं, तो कृपया पाइथन में कोड उदाहरण शामिल करें जो दोनों के बीच अंतर दर्शाते हैं। आपके सहयोग के लिए धन्यवाद!

उत्तर

14

पायथन में "पैरामीटरयुक्त वर्ग" नहीं है (या आवश्यकता है), इसलिए पाइथन में--) में उनके उदाहरण प्रदान करना मुश्किल है। एक मेटाक्लास बस "कक्षा का वर्ग" होता है: सामान्यतः type (जब तक आप पीई 2 में, object, या कुछ अन्य अंतर्निर्मित प्रकार या अन्य नई शैली के वर्ग से विरासत में कक्षा को नई शैली बनाना याद रखें - - पुराने शैली के वर्ग पी 2 में विरासत आर्टेफैक्ट हैं, भाग्यशाली रूप से पी 3 में गायब हो गए हैं, और आपको आदर्श रूप से उनके बारे में भूल जाना चाहिए)। आप कई उन्नत उद्देश्यों के लिए एक कस्टम मेटाक्लास (आमतौर पर type उपclassing) कर सकते हैं, लेकिन यह संभावना नहीं है कि आप कभी भी की आवश्यकता होगी (esp। उस पर विचार करते हुए, python 2.6 के बाद से, कस्टम मेटाक्लास की आवश्यकता के लिए उपयोग किए जाने वाले अधिकांश में से अधिक हो सकता है एक वर्ग सजावट के साथ और अधिक सरलता से किया)।

किसी भी कक्षा सी को देखते हुए, type(C) इसका मेटाक्लास है।

एक पैरामीटरयुक्त वर्ग एक पूरी तरह से अलग अवधारणा है। निकटतम आप अजगर में इसे करने के लिए आ सकता है शायद कि अपने तर्कों के आधार पर बनाता है और एक वर्ग के रिटर्न एक कारखाने समारोह है:

def silly(n): 
    class Silly(object): 
     buh = ' '.join(n * ['hello']) 
    return Silly 

Silly1 = silly(1) 
Silly2 = silly(2) 
a = Silly1() 
print(a.buh) 
b = Silly2() 
print(b.buh) 

hello 
hello hello 

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

+0

मैंने दो दिन पहले पी 3 पर स्विच किया था, सोच रहा था कि चूंकि मैं अभी सिर्फ एक छात्र हूं, मुझे कल की 'हिप नई चीज़' सीखनी चाहिए। मान लीजिए कि एक स्मार्ट चाल थी :-) – yrsnkd

+0

+1। अच्छे खर्च। –

+0

+1 हमेशा के रूप में उत्कृष्ट स्पष्टीकरण। – katrielalex

0

यह write up सहायता का हो सकता है। और this one एक बूढ़ा है लेकिन साथ ही पढ़ने के लायक है। मुझे पता है कि यह आपके प्रश्न का पूरी तरह उत्तर नहीं देता है, लेकिन मुझे उम्मीद है कि यह आपको विचार के लिए भोजन देता है।

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