कौन कॉल करता है यह वास्तव में SO पर चर्चा से उत्पन्न होता है।मेटाक्लास
लघु संस्करण जब Klass
वर्ग घोषणा निष्पादित किया जाता है
def meta(name, bases, class_dict)
return type(name, bases, class_dict)
class Klass(object):
__metaclass__ = meta
meta()
कहा जाता है।
(पायथन आंतरिक) कोड का कौन सा हिस्सा वास्तव में meta()
पर कॉल करता है?
लांग संस्करण
जब वर्ग घोषित किया जाता है, कुछ कोड उचित विशेषता के चेक करते हैं और अगर वहाँ एक __metaclass__
एक प्रकार पर घोषित देखने के लिए है। यदि ऐसा मौजूद है, तो उसे उस मेटाक्लास पर अच्छी तरह से ज्ञात (class_name, bases, class_dict)
विशेषताओं के साथ एक विधि कॉल करना होगा। यह वास्तव में मुझे स्पष्ट नहीं है कि उस कॉल के लिए कौन सा कोड ज़िम्मेदार है।
मैंने सीपीथॉन में कुछ खुदाई की है (नीचे देखें), लेकिन मैं वास्तव में एक निश्चित उत्तर के करीब कुछ लेना चाहता हूं।
विकल्प 1: कहा जाता है सीधे
metaclass कॉल वर्ग पार्स में hardwired है। यदि हां, तो क्या इसके लिए कोई सबूत है?
विकल्प 2: यह type_call()
कॉल type_new()
जो बारी में कॉल _PyType_CalculateMetaclass()
में type.__new__()
कोड द्वारा कहा जाता है। यह पता चलता है कि metaclass संकल्प वास्तव में जब पता लगाने के लिए जो मूल्य धारणा के साथ लाइन में से type()
वापस जाने के लिए यह किया जाएगा कि एक "वर्ग" एक "प्रतिदेय है कि एक रिटर्न की कोशिश कर रहा type()
को कॉल के दौरान किया जाता है ऑब्जेक्ट "।
विकल्प 3: कुछ अलग
मेरे सभी अनुमान शायद पूरी तरह से गलत ज़ाहिर है,।
कुछ उदाहरण मामलों है कि हम बातचीत में के साथ आया था:
उदाहरण 1:
class Meta(type):
pass
class A:
__metaclass__ = Meta
A.__class__ == Meta
यह वही है Meta.__new__()
रिटर्न है, इसलिए इस कानूनी लगता है।
class Meta(type):
def __new__(cls, class_name, bases, class_dict):
return type(class_name, bases, class_dict)
class A(object):
__metaclass__ = Meta
A.__class__ == type
संपादित करें 2: सही शुरुआती संस्करण, ठीक से type
से Meta
निकाले जाते हैं metaclass रूप A.__class__
उदाहरण 2 ही डालता है।
ठीक लगता है, लेकिन मुझे सच में यकीन नहीं है कि यह ऐसा करता है जो मुझे लगता है। इसके अलावा: उदाहरण 1 में व्यवहार करने के लिए कैननिकल विधि क्या है?
संपादित करें 3: का उपयोग करना type.__new__(...)
जो भी मुझे प्रबुद्ध अधिक गहराई से आंतरिक अजगर जादू की जानकारी रखने वाले विकल्प 2.
कर सकते हैं किसी को भी करने के पक्ष में लगता अपेक्षा के अनुरूप काम करने के लिए, लगता है?
संपादित करें: मेटाक्लास पर एक संक्षिप्त संक्षिप्त प्राइमर के लिए ए: http://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/। इसके अलावा कुछ वाकई अच्छे आरेख, संदर्भ भी हैं और पाइथन 2 और 3 के बीच अंतर को भी हाइलाइट करते हैं।
संपादित करें 3: पाइथन 3 के लिए नीचे एक अच्छा जवाब है। पायथन 3 कक्षा ऑब्जेक्ट बनाने के लिए __build_class__
का उपयोग करता है। कोड पथ है - कहीं भी - पायथन में अलग 2.
http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python –
एफडब्ल्यूआईडब्ल्यू, मूल चर्चा इस बारे में थी कि 'SomeClass()' कुछ क्लास .__ वर्ग __.__ कॉल __() को हल करता है या नहीं '(जो आखिरकार 'टाइप .__ नया __()', या यदि iit' टाइप 'करने का संकल्प करता है।__call __() '(जो 'SomeClass .__ वर्ग __.__ call__' के प्रतिनिधि होगा)। –
@brunodesthuilliers मुझे लगता है कि हमने अभी हल किया है और यह पूर्व है। अभी भी कुछ पहेलियों को खुलता है, हालांकि :) – dhke