2011-08-09 10 views
6

तो मैं कुछ कोड लिख रहा हूं और हाल ही में कुछ मिश्रणों को लागू करने की आवश्यकता में आया हूं। मेरा सवाल यह है कि मिश्रण में डिजाइन करने का सही तरीका क्या है? मैं अपनी सटीक क्वेरी को चित्रित करने के लिए नीचे दिए गए उदाहरण कोड का उपयोग करूंगा।पायथन मिक्स इन मानकों

class Projectile(Movable, Rotatable, Bounded): 
    '''A projectile.''' 
    def __init__(self, bounds, position=(0, 0), heading=0.0): 
     Movable.__init__(self) 
     Rotatable.__init__(self, heading) 
     Bounded.__init__(self, bounds) 
     self.position = Vector(position) 

    def update(self, dt=1.0): 
     '''Update the state of the object.''' 
     scalar = self.velocity 
     heading = math.radians(self.heading) 
     direction = Vector([math.sin(heading), math.cos(heading)]) 
     self.position += scalar * dt * direction 
     Bounded.update(self) 

class Bounded(object): 
    '''A mix-in for bounded objects.''' 
    def __init__(self, bounds): 
     self.bounds = bounds 

    def update(self): 
     if not self.bounds.contains(self.rect): 
      while self.rect.top > self.bounds.top: 
       self.rect.centery += 1 
      while self.rect.bottom < self.bounds.bottom: 
       self.rect.centery += 1 
      while self.rect.left < self.bounds.left: 
       self.rect.centerx += 1 
      while self.rect.right > self.bounds.right: 
       self.rect.centerx -= 1 

असल में, मैं सोच रहा हूँ, मिश्रण-इन तरह जावा इंटरफेस जहां एक तरह से है जैसे के अनुबंध (अजगर के मामले निहित में) है कि एक निश्चित चर को परिभाषित करना होगा एक कोड का उपयोग करना चाहता है तो कर रहे हैं/कार्य (ढांचे के विपरीत नहीं), या यह ऊपर लिखा गया कोड जैसा है, जहां प्रत्येक मिश्रण-इन को स्पष्ट रूप से प्रारंभ किया जाना चाहिए?

+0

मुझे नहीं पता कि यह एक नियम है लेकिन पाइथन में यह असामान्य है कि वह nonlinear '__init__'ing है। मैं एक बेस क्लास, "सत्य" माता-पिता को '__init__' विधि रखने के लिए सीमित कर दूंगा। साथ ही, जैसा कि आपका उदाहरण लिखा गया है, आप कभी भी 'Bounded.update() 'को कॉल नहीं करते हैं। – agf

+0

हाँ, उदाहरण को थोड़ा तेज़ लिखा। हालांकि, __init__ के बारे में आपके बिंदु के बारे में, क्या यह सुझाव देता है कि मिश्रण-इन्स को __init__ नहीं होना चाहिए (इस मामले में, वे अनुबंध के साथ आते हैं)? –

+0

मुझे वास्तव में "चाहिए नहीं" के बारे में पता नहीं है - लेकिन पायथन में, यह निश्चित रूप से मैं इसे करने का तरीका हूं। मैंने इसे उत्तर के रूप में पोस्ट नहीं किया क्योंकि यह एक राय थी। मुझे यकीन नहीं है कि आपको इसका जवाब मिल जाएगा कि _isn't_ राय (नीचे दिया गया एक विषय सिर्फ ऑफ-विषय है) तो मुझे बताएं कि क्या आप इसे उत्तर के रूप में पोस्ट करना चाहते हैं। – agf

उत्तर

2

आप पाइथन में दोनों व्यवहार कर सकते हैं। आप सार बेस क्लासेस का उपयोग करके या वर्चुअल फ़ंक्शंस में NotImplementedError को बढ़ाकर पुनर्मूल्यांकन को मजबूर कर सकते हैं।

init माता-पिता के वर्गों में महत्वपूर्ण हैं, तो आपको उन्हें कॉल करना होगा। जैसा कि एरिक्सन ने कहा, माता-पिता के शुरुआती लोगों को कॉल करने के लिए super बिल्टिन फ़ंक्शन का उपयोग करें (इस प्रकार, किसी दिए गए वर्ग के लिए प्रारंभकर्ता केवल एक बार कॉल किया जाएगा)।

निष्कर्ष: आपके पास क्या है इस पर निर्भर करता है। आपके मामले में, आपको init पर कॉल करना होगा, और आपको super का उपयोग करना चाहिए।

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