2009-11-22 18 views

उत्तर

34

सजावटी बहुत अधिक, अधिक सरल और अधिक सीमित हैं - और इसलिए जब भी वांछित प्रभाव मेटाक्लास या कक्षा सजावट के साथ प्राप्त किया जा सकता है तो प्राथमिकता दी जानी चाहिए।

आप किसी भी कक्षा सजावट के साथ क्या कर सकते हैं, आप निश्चित रूप से एक कस्टम मेटाक्लास के साथ कर सकते हैं (केवल "सजावटी कार्य" की कार्यक्षमता लागू करें, यानी, वह वर्ग वस्तु लेता है और इसे संशोधित करता है, पाठ्यक्रम में मेटाक्लास के __new__ या __init__ जो क्लास ऑब्जेक्ट बनाते हैं! -)।

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

उदाहरण के लिए, यदि आप एक वर्ग वस्तु X ऐसे print X (या अजगर 3 निश्चित रूप से print(X) में ;-) को प्रदर्शित करता है कि peekaboo! बनाने के लिए चाहते हैं। आप कस्टम मेटाक्लास के बिना संभवतः ऐसा नहीं कर सकते हैं, क्योंकि __str__ का मेटाक्लास का ओवरराइड यहां महत्वपूर्ण अभिनेता है, यानी आपको के कस्टम मेटाक्लास में def __str__(cls): return "peekaboo!" की आवश्यकता है।

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

+0

प्रतिष्ठित साथी देशवासियों से दिलचस्प जवाब =) – gpilotino

+0

हाय गिनो, हमेशा विशेष रूप से एक सहयोगी की मदद करने के लिए खुश हैं ;-)। –

+6

अच्छा .. यह 4 साल हो गया है और मुझे यह सवाल Google पर मिला। मैं बस आपके उदाहरण के बारे में एक नोट बनाना चाहता हूँ। मैंने एक सजावटी 'foo (cls) को परिभाषित किया है जिसमें 2 कथन हैं: 'cls .__ str__ = lambda self:" peekaboo! "' और उसके बाद' वापसी cls 'के ठीक बाद, और यह वास्तव में काम किया - मैंने ' एक जटिल मेटाक्लास के बजाय सजावटी के साथ कुछ वर्ग की __str__' विधि .. मैं बस इसे नोट करना चाहता था, और शायद कुछ जानना कि मुझे कुछ याद आ रहा है या नहीं। – rboy

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