2011-06-09 13 views
6

मैं एक वर्ग है:mixins, बहु विरासत, कंस्ट्रक्टर्स, और डेटा

class A(object): 
    def __init__(self, *args): 
     # impl 

इसे "mixin", मूल रूप से कुछ डेटा और तरीकों के साथ अन्य वर्ग:

class Mixin(object): 
    def __init__(self): 
     self.data = [] 

    def a_method(self): 
     # do something 

अब मैं बनाने मिश्रण के साथ ए के उप-वर्ग:

class AWithMixin(A, Mixin): 
    pass 

मेरी समस्या यह है कि मैं ए और मिक्सिन दोनों के रचनाकारों को बुलाता हूं। मैंने एविथमिक्सिन को स्वयं का एक कन्स्ट्रक्टर देने पर विचार किया, जिसमें सुपर को बुलाया गया था, लेकिन सुपर क्लास के रचनाकारों के पास अलग-अलग तर्क सूचियां हैं। सबसे अच्छा संकल्प क्या है?

+1

आपको दो बेस क्लास के रचनाकारों को कॉल करने से रोकने के लिए क्या करना है (उनके उचित ar के साथ स्मारक) 'AWithMixin .__ init__' से? – NPE

+0

यह पहले से ही गहराई में जवाब दिया गया है। Http://stackoverflow.com/a/6100595/763269 –

उत्तर

8

मैं भी OOP करने के लिए काफी नई हूँ, लेकिन इस कोड पर समस्या क्या है:

class AWithMixin(A, Mixin): 
    def __init__(self, *args): 
     A.__init__(self, *args) 
     Mixin.__init__(self) 
+2

देखें जो सबसे अच्छा समाधान है और मैं हमेशा इसका उपयोग करता हूं। हालांकि, यदि 'ए' और' मिक्सिन 'दोनों कुछ वर्ग (जैसे 'बेस') बढ़ाते हैं और दोनों' बेस .__ init __() 'को कॉल करते हैं तो यह [सुपर() फ़ंक्शन] (http: // stackoverflow) का उपयोग करना अनिवार्य हो सकता है। कॉम/q/576,169)। यह जटिल आईएमएचओ है और मैं जानना चाहता हूं लेकिन यदि संभव हो तो इससे बचें। – brandizzi

+0

@brandizzi, जैसा कि मैंने उत्तर पर कहा था, मैं ओओपी के लिए नया हूं। मैंने सुपर फ़ंक्शन देखा, लेकिन समझ में नहीं आया। अगर मैंने इस वर्ग [कोड] सुपर (एविथमिक्सिन, स्वयं) पर कहा है .__ init __() [/ code], मैं ए .__ init__ और Mixin .__ init__ दोनों को कैसे कॉल कर सकता हूं? और विभिन्न तर्क निर्दिष्ट करें? – utdemir

+1

समस्या यह है कि यह समाधान विशेष रूप से एक्स्टेंसिबल नहीं है, और यह पूरी तरह से encapsulation के बिंदु को अनदेखा करता है, और यह गलत क्रम में मिश्रण निर्दिष्ट करता है। यदि आप मिश्रण में विधियों को ओवरराइड करना चाहते हैं, तो उस मिश्रण पर उस मिश्रण पर नियंत्रण हो जाता है और एक ही विधि को सुपर क्लास में कॉल करने के लिए जिम्मेदार होना चाहिए। तथ्य यह है कि मिश्रण एक अलग तर्क सूची लेता है, यह बताता है कि इसे गलत तरीके से कोडित किया गया है/इस बच्चे वर्ग के उपयोग के लिए डिज़ाइन नहीं किया गया है - यह [एलएसपी] (http://en.wikipedia.org/wiki/Liskov_substitution_principle) का उल्लंघन कर रहा है) । – quodlibetor

10
class A_1(object): 
    def __init__(self, *args, **kwargs): 
     print 'A_1 constructor' 
     super(A_1, self).__init__(*args, **kwargs) 

class A_2(object): 
    def __init__(self, *args, **kwargs): 
     print 'A_2 constructor' 
     super(A_2, self).__init__(*args, **kwargs) 

class B(A_1, A_2): 
    def __init__(self, *args, **kwargs): 
     super(B, self).__init__(*args, **kwargs) 
     print 'B constructor' 

def main(): 
    b = B() 
    return 0 

if __name__ == '__main__': 
    main() 
  1. A_1 निर्माता
  2. A_2 निर्माता
  3. बी निर्माता
संबंधित मुद्दे