2016-09-15 5 views
5

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

class OldStyle: 
    pass 

यह एक नई शैली वर्ग है:

class NewStyle2: 
    __metaclass__ = type 

है वहाँ:

class NewStyle(object): 
    pass 

यह भी एक नई शैली वर्ग है NewStyle और NewStyle2 के बीच जो कुछ भी अंतर है?

मुझे लगता है कि object से विरासत का एकमात्र प्रभाव वास्तव में type मेटाक्लास को परिभाषित करना है, लेकिन मुझे इसकी कोई पुष्टि नहीं मिल रही है, इसके अलावा मुझे कोई अंतर नहीं दिखता है।

उत्तर

2

बहुत अधिक हाँ, NewStyle और NewStyle2 के बीच कोई अंतर नहीं है। दोनों type प्रकार OldStyle प्रकार classobj के प्रकार हैं।

यदि आप ऑब्जेक्ट से उप-वर्ग, __class__ of object (meaning type) is going का उपयोग करने के लिए; यदि आप __metaclass__ that is going to get picked up की आपूर्ति करते हैं।

यदि __metaclass__ के रूप में कुछ भी नहीं दिया जाता है और आप object, Py_ClassType is assigned as the metaclass से आपके लिए उत्तराधिकारी नहीं हैं।

सभी मामलों में, metaclass.__new__ कॉल करने जा रहा है। Py_ClassType.__new__ के लिए यह परिभाषित अर्थशास्त्र (मैंने कभी उनकी जांच नहीं की है) और type.__new__ it makes sure to pack object के लिए अपनी कक्षा के आधार पर परिभाषित किया है।

बेशक

, एक समान प्रभाव द्वारा हासिल की है:

cls = type("NewStyle3",(), {}) 

जहां तुरंत ही एक कॉल type लिए किया जाता है; यह सिर्फ एक बड़ी परेशानी है :-)

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

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