खोज…


वाक्य - विन्यास

  • class ClassName ( MainClass , Mixin1 , Mixin2 , ...): # ClassName नाम के साथ एक क्लास घोषित करने के लिए इस्तेमाल किया जाता है, मुख्य (प्रथम) क्लास MainClass , और मिक्सइन 1 , Mixin2 , आदि।
  • वर्ग ClassName ( Mixin1 , MainClass , Mixin2 , ...): # 'मुख्य' वर्ग के लिए प्रथम श्रेणी होना आवश्यक नहीं है; वास्तव में इसके और मिक्सिन में कोई अंतर नहीं है

टिप्पणियों

एक वर्ग में मिक्सचर जोड़ना एक सुपरक्लास को जोड़ने जैसा लगता है, क्योंकि यह बहुत अधिक है। एक वर्ग का एक उद्देश्य mixin साथ फू भी फू का एक उदाहरण हो जाएगा, और isinstance(instance, Foo) सच वापस आ जाएगी

Mixin

मिक्सिन विभिन्न वर्गों में उपयोग किए जा सकने वाले गुणों और विधियों का एक समूह है, जो आधार वर्ग से नहीं आते हैं। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषाओं में, आप आमतौर पर विभिन्न वर्गों की वस्तुओं को समान कार्यक्षमता देने के लिए विरासत का उपयोग करते हैं; यदि वस्तुओं के एक सेट में कुछ क्षमता है, तो आप उस क्षमता को आधार वर्ग में रखते हैं, जो दोनों वस्तुओं से प्राप्त होती है।

उदाहरण के लिए, मान लें कि आपके पास Car , Boat और Plane । इन सभी वर्गों की वस्तुओं में यात्रा करने की क्षमता होती है, इसलिए वे फ़ंक्शन travel करते travel । इस परिदृश्य में, वे सभी एक ही मूल तरीके से यात्रा करते हैं; एक मार्ग प्राप्त करके, और उसके साथ आगे बढ़ना। इस फ़ंक्शन को लागू करने के लिए, आप Vehicle से सभी वर्गों को प्राप्त कर सकते हैं, और फ़ंक्शन को उस साझा वर्ग में डाल सकते हैं:

class Vehicle(object):
   """A generic vehicle class."""

   def __init__(self, position):
       self.position = position

   def travel(self, destination):
       route = calculate_route(from=self.position, to=destination)
       self.move_along(route)

class Car(Vehicle):
   ...

class Boat(Vehicle):
   ...

class Plane(Vehicle):
   ...

इस कोड के साथ, आप कॉल कर सकते हैं travel एक कार पर ( car.travel("Montana") ), नाव ( boat.travel("Hawaii") ), और विमान ( plane.travel("France") )

हालाँकि, क्या होगा यदि आपके पास कार्यक्षमता है जो एक आधार वर्ग के लिए उपलब्ध नहीं है? उदाहरण के लिए, उदाहरण के लिए, आप Car को रेडियो देना चाहते हैं और रेडियो स्टेशन पर गाना बजाने के लिए इसका उपयोग करने की क्षमता play_song_on_station साथ है, लेकिन आपके पास एक ऐसी Clock भी है जो रेडियो का भी उपयोग कर सकती है। Car और Clock एक बेस क्लास ( Machine ) साझा कर सकते हैं। हालांकि, सभी मशीनें गाने नहीं चला सकती हैं; Boat और Plane (उदाहरण में कम से कम) नहीं कर सकते। तो आप बिना डुप्लिकेट कोड के कैसे पूरा करेंगे? आप एक मिश्रण का उपयोग कर सकते हैं। पायथन में, एक वर्ग को एक मिश्रण देना उतना ही सरल है जितना इसे उपवर्गों की सूची में जोड़ना, इस तरह

class Foo(main_super, mixin): ...

Foo गुण और के तरीकों के सभी प्राप्त कर लेंगे main_super , लेकिन यह भी उन लोगों के mixin रूप में अच्छी तरह।

इसलिए, कक्षाओं को Car देने और रेडियो का उपयोग करने की क्षमता को देखने के लिए, आप Car को अंतिम उदाहरण से हटा सकते हैं और इसे लिख सकते हैं:

class RadioUserMixin(object):
   def __init__(self):
       self.radio = Radio()

   def play_song_on_station(self, station):
       self.radio.set_station(station)
       self.radio.play_song()

class Car(Vehicle, RadioUserMixin):
   ...

class Clock(Vehicle, RadioUserMixin):
   ...

अब आप car.play_song_on_station(98.7) और clock.play_song_on_station(101.3) कॉल कर सकते हैं, लेकिन boat.play_song_on_station(100.5) तरह कुछ नहीं boat.play_song_on_station(100.5)

मिश्रणों के साथ महत्वपूर्ण बात यह है कि वे आपको बहुत भिन्न वस्तुओं में कार्यक्षमता जोड़ने की अनुमति देते हैं, जो इस कार्यक्षमता के साथ "मुख्य" उपवर्ग साझा नहीं करते हैं, लेकिन फिर भी इसके लिए कोड साझा करते हैं। मिश्रण के बिना, उपरोक्त उदाहरण की तरह कुछ करना बहुत कठिन होगा, और / या कुछ पुनरावृत्ति की आवश्यकता हो सकती है।

मिक्सिन्स में ओवरराइडिंग मेथड्स

मिक्सिन एक प्रकार का वर्ग है जो एक क्लास में अतिरिक्त गुणों और विधियों में "मिक्स" करने के लिए उपयोग किया जाता है। यह आमतौर पर ठीक है क्योंकि कई बार मिक्सिन क्लास एक दूसरे के, या बेस क्लास के तरीकों को ओवरराइड नहीं करते हैं। लेकिन अगर आप अपने मिश्रणों में तरीकों या गुणों को ओवरराइड करते हैं, तो इससे अप्रत्याशित परिणाम हो सकते हैं क्योंकि पायथन में कक्षा पदानुक्रम को दाएं से बाएं परिभाषित किया गया है।

उदाहरण के लिए, निम्नलिखित कक्षाएं लें

class Mixin1(object):
    def test(self):
        print "Mixin1"

class Mixin2(object):
    def test(self):
        print "Mixin2"

class BaseClass(object):
    def test(self):
        print "Base"

class MyClass(BaseClass, Mixin1, Mixin2):
    pass

इस मामले में मिक्सिन 2 क्लास बेस क्लास है, जिसे मिक्सिन 1 द्वारा और अंत में बेसक्लास द्वारा विस्तारित किया गया है। इस प्रकार, यदि हम निम्नलिखित कोड स्निपेट निष्पादित करते हैं:

>>> x = MyClass()
>>> x.test()
Base

हम देखते हैं कि लौटाया गया परिणाम बेस क्लास का है। इससे आपके कोड के तर्क में अप्रत्याशित त्रुटियां हो सकती हैं और इसे ध्यान में रखा जाना चाहिए



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow