2012-02-09 14 views
5

मैं एक metaclass है: जब मैं का उपयोग इन मैं निम्नलिखित त्रुटि मिलती हैmetaclass त्रुटि: प्रकार .__ init __() लेता है 1 या 3 तर्क

class MyClass(object): 
    __metaclass__ = MyMeta 

:

class MyMeta(type): 
    def __init__(cls, name, bases, dct): 
     # Do something 
     ... 

     return super(MyMeta, cls).__init__(cls, name, bases, dct) 

और एक वर्ग

E  TypeError: Error when calling the metaclass bases 
E   type.__init__() takes 1 or 3 arguments 

समस्या क्या है, और type.__init__() तर्कों की एक सटीक चर संख्या क्यों लेते हैं?

उत्तर

8

समस्या यह है कि पाइथन 2.5 से पायथन 2.6 type.__init__() से अपग्रेड में बदल दिया गया था ताकि आपको अब cls में पास करने की आवश्यकता न हो। (

return type.__init__(cls, name, bases, dct) 

और सब कुछ ठीक काम करेंगे अजगर में:

return super(MyMeta, cls).__init__(name, bases, dct) 

एक अन्य समाधान पूरी तरह super कॉल से बचने और यह कर (हालांकि यह थोड़ा कम अच्छा है) करने के लिए है: तो बस super फोन करना > = 2.6)।

क्यों type.__init__() तर्कों की भिन्न संख्या ले सकता है, the documentation देखें।

>>> number = 1 
>>> type(number) 
<type 'int'> 
>>> type('my string') 
<type 'str'> 

metaclasses और प्रकार के बारे में अधिक जानकारी के लिए What is a metaclass in Python? देखें: यह इतना है कि रूप में अच्छी तरह एक निर्माता के रूप में उपयोग के रूप में, आप type(myobject) कॉल कर सकते हैं और यह myobject के प्रकार वापस आ जाएगी है।

+3

ध्यान दें कि 'सुपर (माईमेटा, सीएलएस) .__ init __ (नाम, आधार, डीसीटी) 'यह करने का * सही * तरीका है, यहां तक ​​कि 2.5 में (और 2.2 के रूप में अभी तक।) एकमात्र मामला जिसमें आप 'cls' को पहले तर्क के रूप में '__new__'' के साथ पास किया गया है,' __init__' के साथ नहीं (और यह 'टाइप' या मेटाक्लास के लिए विशिष्ट नहीं है।) क्या बदल गया है कि' टाइप .__ init __() 'अपवादों को निगलने से रोक दिया गया है, जैसा कि 'वस्तु .__ init __()'। –

+2

@ julio.alegria http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ –

+0

@ हार्लेहोल्कोम्बे मुझे पता है कि आपके प्रश्न का उत्तर देने की अनुमति है, लेकिन ... 30 सेकंड? इसका मतलब है कि प्रश्न पोस्ट करने से पहले भी जवाब तैयार था, यह थोडा अजीब – juliomalegria

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