अद्यतन विधियां जोड़ने - 2012/12/13गतिशील रूप से या metaclass बिना
बस स्पष्ट करने के लिए - मैं मायनों में इतना रुचि वर्गों के लिए पद्धतियां जोड़ने का तरीका नहीं कर रहा हूँ - के रूप में आप में नीचे देख सकते हैं मेरी प्रश्न और लोगों के उत्तरों में, ऐसा करने के एक से अधिक तरीके हैं (गाल में जीभ और मेरे पर्ल स्वयं को टोपी टिप)।
जिस चीज में मुझे रूचि है, वह सीख रहा है कि अलग-अलग दृष्टिकोणों का उपयोग करके कक्षाओं में विधियों को जोड़ने का मौलिक अंतर क्या है और वास्तव में मुझे मेटाक्लास का उपयोग करने की आवश्यकता क्यों है। उदाहरण के लिए A Primer on Python Metaclass Programming कहा गया है कि:
शायद metaclasses का सबसे आम उपयोग [...]: बताया हटाने, नाम बदलने, या उत्पादन वर्ग में परिभाषित किया उन लोगों के लिए तरीकों प्रतिस्थापन।
और चूंकि ऐसा करने के और तरीके हैं, इसलिए मैं परेशान हूं और स्पष्टीकरण की तलाश में हूं।
धन्यवाद!
मूल - 2012/12/12
मैं गतिशील (उस वर्ग पर आधारित है और नई जनरेट वर्ग) एक वर्ग के लिए विधियों को जोड़ने की जरूरत है। मैं दो दृष्टिकोणों के साथ आया, जिसमें मेटाक्लास शामिल था, दूसरा एक बिना कर रहा था।
class Meta(type):
def __init__(cls, *args, **kwargs):
setattr(cls, "foo", lambda self: "[email protected]%s(class %s)" % (self,
cls.__name__))
class Y(object):
__metaclass__ = Meta
y = Y()
y.foo() # Gives '[email protected]<__main__.Y object at 0x10e4afd10>(class Y)'
: metaclass के साथ)
दृष्टिकोण # 1, मैं क्या दो दृष्टिकोण मुझे तथ्य बाद "काला जादू" metaclass शामिल नहीं करता है के अलावा अन्य दे में कोई अंतर नहीं देख सकते हैं
दृष्टिकोण # 2 metaclass बिना:
class Z(object):
def __init__(self):
setattr(self.__class__, "foo",
lambda self: "[email protected]%s(class %s)" %
(self, self.__class__.__name__))
z = Z()
z.foo() # Gives '[email protected]<__main__.Z object at 0x10c865dd0>(class Z)'
जहां तक मेरा कर सकते हैं बताओ, दोनों दृष्टिकोण मुझे एक ही परिणाम और "व्यक्तित्व" देते हैं। यहां तक कि जब मैं type("NewClassY", (Y,), {})
या type("NewClassZ", (Z,), {})
का उपयोग करके एक नई कक्षाएं बनाने का प्रयास करता हूं, तो मुझे वही अपेक्षित परिणाम मिलते हैं जो दोनों दृष्टिकोणों के बीच भिन्न नहीं होते हैं।
तो, मैं सोच रहा हूँ अगर वहाँ वास्तव में, दृष्टिकोण में किसी भी "अंतर्निहित" अंतर नहीं है या यह है कि अगर हो, तो जो कुछ भी "काटने" मुझे बाद में अगर मैं इस्तेमाल किया जाएगा या तो # 1 या # 2 या बस एक वाक्य रचनात्मक चीनी?
पीएस: हां, मैंने पाइथन और पायथनिक डेटा मॉडल में मेटाक्लास के बारे में बात करते हुए अन्य धागे पढ़े हैं।
क्या आप 'वाई.फू' और 'जेड' को कॉल कर सकते हैं।दोनों दृष्टिकोणों का उपयोग कर foo'? – Blender
अंतर यह है कि मेटाक्लास क्लास परिभाषित होने के समय विधियों का निर्माण करेगा और जब आप कक्षा को तुरंत चालू करेंगे तो '__init__'way विधियों का निर्माण करेगा। कई विरासत (मिश्रण) भी हैं जिन्हें आप विधियों को जोड़ने के लिए उपयोग कर सकते हैं। –
@ ब्लेंडर नंबर, आप उन्हें इस तरह से कॉल नहीं कर सकते क्योंकि वे "कक्षा विधियां" नहीं हैं। – TomasHeran