2012-05-08 12 views
5

पायथन 2.x में, सभी नए शैली के वर्ग object से स्पष्ट रूप से या स्पष्ट रूप से प्राप्त होते हैं। तो फिर इसे देखो:पुरानी शैली के वर्ग, नई शैली के वर्ग और मेटाक्लास

>>> class M(type): 
...  pass 
... 
>>> class A: 
...  __metaclass__ = M 
... 
>>> class B: 
...  pass 
... 
>>> a = A() 
>>> b = B() 
>>> type(A) 
<class '__main__.M'> 
>>> type(a) 
<class '__main__.A'> 

इसका मतलब यह है A एक नई शैली वर्ग है? लेकिन Aobject से वैसे भी वारिस नहीं है, है ना?

>>> type(B) 
<class 'classobj'> 
>>> type(b) 
<type 'instance'> 

ठीक है, B क्लासिक क्लास है, है ना?

>>> isinstance(A, object) 
True 
>>> isinstance(B, object) 
True 

क्यों दोनों A के उदाहरण और object की B उदाहरण हैं?

यदि Bobject का एक उदाहरण है, तो type(B)classobj नहीं होगा, है ना?

+4

कुछ भी एक वस्तु है! – orlp

+0

आपको इस प्रश्न में '__slots__' चीज़ नहीं डालनी चाहिए थी। यह पूरी तरह से एक और सवाल है। –

+0

@ क्रिस मॉर्गन, हाँ, मुझे बस एहसास हुआ। – Alcott

उत्तर

5

मेटाक्लास के बारे में आप यहां पढ़ सकते हैं: http://docs.python.org/reference/datamodel.html#customizing-class-creation। आम तौर पर मेटाक्लास का उद्देश्य नए स्टाइल वर्गों के साथ काम करना है। जब आप लिखें:

class M(type): 
    pass 

और आप का उपयोग करें:

class C: 
    __metaclass__ = M 

तरीके के कारण आपसे एम परिभाषित किया गया है एक नई शैली वस्तु पैदा करेगा (डिफ़ॉल्ट कार्यान्वयन का उपयोग करता type एक नई शैली वर्ग बनाने के लिए)। आप हमेशा अपने मेटाक्लास को कार्यान्वित कर सकते हैं जो types.ClassType का उपयोग करके पुरानी शैली के वर्ग बनाएगा।

1

स्लॉट्स के बारे में आप यहाँ http://docs.python.org/release/2.5.2/ref/slots.html पढ़ सकते हैं, एक टुकड़ा:

डिफ़ॉल्ट रूप से, दोनों पुराने और नए शैली वर्गों के उदाहरण विशेषता भंडारण के लिए एक शब्दकोश है।

नए शैली के वर्गों के लिए आप __slots__ जोड़ सकते हैं, तो प्रति-ऑब्जेक्ट शब्दकोश नहीं बनाया जाएगा।

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