2009-07-26 13 views
10

के लिए int और एमआरओ विस्तारित पाइथन में, मैं बिल्टिन 'int' प्रकार का विस्तार करने की कोशिश कर रहा हूं। ऐसा करने में मैं निर्माता के लिए कुछ keywoard बहस में पास करना चाहते हैं, तो मैं ऐसा करते हैं:पायथन: __init__

class C(int): 
    def __init__(self, val, **kwargs): 
     super(C, self).__init__(val) 
     # Do something with kwargs here... 

हालांकि, जबकि बुला C(3) ठीक काम करता है, C(3, a=4) देता है:

'a' is an invalid keyword argument for this function` 

और C.__mro__ रिटर्न की उम्मीद:

(<class '__main__.C'>, <type 'int'>, <type 'object'>) 

लेकिन यह है कि अजगर int.__init__ पहले कॉल करने के लिए कोशिश कर रहा है लगता है ... किसी को भी पता है क्यों? क्या यह दुभाषिया में एक बग है?

उत्तर

7

अजगर डाटा मॉडल सलाह के लिये दस्तावेज __new__ का उपयोग कर:

object.new(cls[, ...])

नई() (, पूर्णांक की तरह str, या टपल) अपरिवर्तनीय प्रकार के उपवर्गों अनुमति देने के लिए मुख्य रूप से करना है करने के लिए उदाहरण निर्माण अनुकूलित करें। कक्षा निर्माण को अनुकूलित करने के लिए इसे कस्टम मेटाक्लास में भी सामान्य रूप से ओवरराइड किया जाता है।

कुछ इस तरह उदाहरण आप दे दी है के लिए यह करना चाहिए:

class C(int): 

    def __new__(cls, val, **kwargs): 
     inst = super(C, cls).__new__(cls, val) 
     inst.a = kwargs.get('a', 0) 
     return inst 
3

आपको "__new__" ओवरराइड करना चाहिए, "__init__" नहीं, क्योंकि इनट्स अपरिवर्तनीय हैं।

3

क्या बाकी सब (अभी तक) ने कहा। Int अपरिवर्तनीय हैं, इसलिए आपको नया का उपयोग करना होगा।

इसके अलावा

देखना (करने के लिए स्वीकार किए जाते हैं जवाब):

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