2009-05-04 7 views
6

मैं पाइथन में मेटाक्लास के बारे में जानने की कोशिश कर रहा हूं। मुझे मुख्य विचार मिलता है, लेकिन मैं तंत्र को सक्रिय नहीं कर सकता। जैसा कि मैं इसे समझता हूं, आप वैश्विक या कक्षा स्तर पर एम को __metaclass__ सेट करके कक्षा के निर्माण के दौरान मेटाक्लास के रूप में निर्दिष्ट करने के लिए एम निर्दिष्ट कर सकते हैं। यह परीक्षण बाहर करने के लिए, मैं निम्नलिखित प्रोग्राम लिखा है:क्या __metaclass__ पायथन में मेटाक्लास के उपयोग को मजबूर नहीं करना चाहिए?

p = print 

class M(type): 
    def __init__(*args): 
     type.__init__(*args) 
     print("The rain in Spain") 

p(1) 
class ClassMeta: 
    __metaclass__ = M 

p(2) 
__metaclass__ = M 
class GlobalMeta: pass 

p(3) 
M('NotMeta2',(), {}) 

p(4) 

हालांकि, जब मैं इसे चलाने के लिए, मैं निम्नलिखित उत्पादन प्राप्त करें:

 
C:\Documents and Settings\Daniel Wong\Desktop>python --version 
Python 3.0.1 

C:\Documents and Settings\Daniel Wong\Desktop>python meta.py 
1 
2 
3 
The rain in Spain 
4 

मुझे नहीं देखना चाहिए "स्पेन में बारिश" के बाद 1 और 2? यहाँ क्या चल रहा है?

+1

डबल नकारात्मक "नहीं ... बल नहीं है" पार्स करना मुश्किल है। क्या आप सवाल ठीक कर सकते हैं? –

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे लगता है कि अब समझना आसान होना चाहिए। – allyourcode

उत्तर

13

अजगर 3 (जो आप उपयोग कर रहे हैं) में metaclasses वर्ग परिभाषा में एक कीवर्ड पैरामीटर द्वारा निर्दिष्ट कर रहे हैं:

class ClassMeta(metaclass=M): 
    pass 

एक __metaclass__ वर्ग संपत्ति या वैश्विक चर निर्दिष्ट करना है पायथन 2.x से पुराने वाक्य रचना और नहीं अब समर्थित है। "What's new in Python 3" और PEP 2115 भी देखें।

2

यह काम करता है के रूप में आप अजगर 2.6 में उम्मीद (और पुराने), लेकिन 3.0 metaclasses में अलग ढंग से निर्दिष्ट कर रहे हैं:

class ArgMeta(metaclass=M): ... 
2

metaclasses की वाक्य रचना अजगर 3.0 में changed है। __metaclass__ विशेषता कक्षा या न ही मॉड्यूल स्तर पर विशेष नहीं है। आपकी अपेक्षा से कम के रूप में

1 
The rain in Spain 

: तुम क्या करने की कोशिश कर रहे हैं क्या करने के लिए, आप class बयान के एक कीवर्ड तर्क के रूप में metaclass निर्दिष्ट करना होगा:

p = print 

class M(type): 
    def __init__(*args): 
     type.__init__(*args) 
     print("The rain in Spain") 

p(1) 
class ClassMeta(metaclass=M): pass 

पैदावार।

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