इस उत्तर का उद्देश्य मिश्रणों को उन उदाहरणों से समझाना है :
आत्म-निहित : लघु, उदाहरण को समझने के लिए किसी भी पुस्तकालय को जानने की आवश्यकता नहीं है।
पायथन में , अन्य भाषाओं में नहीं।
यह समझा जा सकता है कि रूबी जैसी अन्य भाषाओं के उदाहरण थे क्योंकि यह शब्द उन भाषाओं में बहुत अधिक सामान्य है, लेकिन यह पायथन धागा है।
यह विवादास्पद प्रश्न पर भी विचार करेगा:
एक मिश्रण की विशेषता के लिए एकाधिक वंशानुक्रम आवश्यक है या नहीं?
परिभाषाएं
मुझे अभी तक "आधिकारिक" स्रोत से प्रशस्ति पत्र देखने को नहीं मिला है, जो स्पष्ट रूप से कह रहा है कि पायथन में एक मिश्रण है।
मैंने एक मिक्सिन की 2 संभावित परिभाषाएं देखी हैं (यदि उन्हें अन्य समान अवधारणाओं जैसे अमूर्त आधार वर्गों से अलग माना जाता है), और लोग पूरी तरह से सहमत नहीं हैं, जिस पर एक सही है।
विभिन्न भाषाओं के बीच आम सहमति अलग-अलग हो सकती है।
परिभाषा 1: कोई बहु विरासत नहीं है
एक मिक्सिन एक वर्ग ऐसा है कि कक्षा की कुछ विधि एक ऐसी विधि का उपयोग करती है जिसे कक्षा में परिभाषित नहीं किया जाता है।
इसलिए वर्ग का तात्पर्य तात्कालिकता से नहीं है, बल्कि एक आधार वर्ग के रूप में है। अन्यथा उदाहरण में ऐसी विधियाँ होंगी जिन्हें अपवाद के बिना नहीं बुलाया जा सकता है।
एक बाधा जो कुछ स्रोत जोड़ते हैं वह यह है कि कक्षा में डेटा, केवल विधियाँ नहीं हो सकती हैं, लेकिन मैं यह नहीं देखता कि यह क्यों आवश्यक है। हालांकि व्यवहार में, कई उपयोगी मिश्रणों के पास कोई डेटा नहीं है, और डेटा के बिना आधार कक्षाएं उपयोग करने के लिए सरल हैं।
एक क्लासिक उदाहरण केवल <=
और से सभी तुलना ऑपरेटरों का कार्यान्वयन है ==
:
class ComparableMixin(object):
"""This class has methods which use `<=` and `==`,
but this class does NOT implement those methods."""
def __ne__(self, other):
return not (self == other)
def __lt__(self, other):
return self <= other and (self != other)
def __gt__(self, other):
return not self <= other
def __ge__(self, other):
return self == other or self > other
class Integer(ComparableMixin):
def __init__(self, i):
self.i = i
def __le__(self, other):
return self.i <= other.i
def __eq__(self, other):
return self.i == other.i
assert Integer(0) < Integer(1)
assert Integer(0) != Integer(1)
assert Integer(1) > Integer(0)
assert Integer(1) >= Integer(1)
# It is possible to instantiate a mixin:
o = ComparableMixin()
# but one of its methods raise an exception:
#o != o
यह विशेष उदाहरण functools.total_ordering()
डेकोरेटर के माध्यम से प्राप्त किया जा सकता था , लेकिन यहां खेल को पहिया को मजबूत करना था:
import functools
@functools.total_ordering
class Integer(object):
def __init__(self, i):
self.i = i
def __le__(self, other):
return self.i <= other.i
def __eq__(self, other):
return self.i == other.i
assert Integer(0) < Integer(1)
assert Integer(0) != Integer(1)
assert Integer(1) > Integer(0)
assert Integer(1) >= Integer(1)
परिभाषा 2: एकाधिक वंशानुक्रम
एक मिश्रण एक डिज़ाइन पैटर्न है जिसमें बेस क्लास की कुछ विधि एक ऐसी विधि का उपयोग करती है जिसे वह परिभाषित नहीं करता है, और यह विधि किसी अन्य बेस क्लास द्वारा लागू की जाती है , न कि परिभाषा 1 की तरह व्युत्पन्न द्वारा।
अवधि mixin वर्ग जो कि डिजाइन पैटर्न में इस्तेमाल किया जा करने का इरादा कर रहे हैं आधार वर्ग को संदर्भित करता है (उन है कि विधि का उपयोग करें, या उन है कि इसे लागू टूडू?)
यह तय करना आसान नहीं है कि किसी दिए गए वर्ग का मिश्रण है या नहीं: विधि को व्युत्पन्न वर्ग पर ही लागू किया जा सकता है, जिस स्थिति में हम परिभाषा 1 पर वापस आते हैं। आपको लेखक के इरादों पर विचार करना होगा।
यह पैटर्न दिलचस्प है क्योंकि आधार वर्गों के विभिन्न विकल्पों के साथ कार्यात्मकताओं को फिर से जोड़ना संभव है:
class HasMethod1(object):
def method(self):
return 1
class HasMethod2(object):
def method(self):
return 2
class UsesMethod10(object):
def usesMethod(self):
return self.method() + 10
class UsesMethod20(object):
def usesMethod(self):
return self.method() + 20
class C1_10(HasMethod1, UsesMethod10): pass
class C1_20(HasMethod1, UsesMethod20): pass
class C2_10(HasMethod2, UsesMethod10): pass
class C2_20(HasMethod2, UsesMethod20): pass
assert C1_10().usesMethod() == 11
assert C1_20().usesMethod() == 21
assert C2_10().usesMethod() == 12
assert C2_20().usesMethod() == 22
# Nothing prevents implementing the method
# on the base class like in Definition 1:
class C3_10(UsesMethod10):
def method(self):
return 3
assert C3_10().usesMethod() == 13
आधिकारिक पायथन घटनाएँ
पर collections.abc के लिए सरकारी documentatiton प्रलेखन स्पष्ट रूप से इस शब्द का इस्तेमाल Mixin के तरीके ।
यह बताता है कि यदि एक वर्ग:
- औजार
__next__
- एक ही वर्ग से विरासत में मिला है
Iterator
तब वर्ग को मुफ्त में एक मिश्रण __iter__
विधि मिलती है ।
इसलिए कम से कम प्रलेखन के इस बिंदु पर, मिक्सिन को कई विरासत की आवश्यकता नहीं है , और परिभाषा 1 के साथ सुसंगत है।
प्रलेखन विभिन्न बिंदुओं पर विरोधाभासी हो सकता है, और अन्य महत्वपूर्ण पायथन पुस्तकालय अपने प्रलेखन में अन्य परिभाषा का उपयोग कर सकते हैं।
यह पृष्ठ भी शब्द का उपयोग करता है Set mixin
, जो स्पष्ट रूप से यह बताता है कि कक्षाएं Set
और Iterator
मिक्सिन कक्षाएं कहला सकती हैं।
अन्य भाषाओं में
रूबी: स्पष्ट रूप से मिक्सिन के लिए कई वंशानुक्रम की आवश्यकता नहीं है, जैसा कि प्रमुख संदर्भ पुस्तकों में वर्णित है जैसे कि प्रोग्रामिंग रूबी और द रूब प्रोग्रामिंग भाषा
C ++: एक विधि जो कार्यान्वित नहीं की जाती है वह एक शुद्ध आभासी विधि है।
परिभाषा 1 एक सार वर्ग (एक वर्ग जिसमें एक शुद्ध आभासी विधि है) की परिभाषा के साथ मेल खाता है। उस वर्ग को तत्काल नहीं किया जा सकता है।
आभासी विरासत के साथ परिभाषा 2 संभव है: दो व्युत्पन्न वर्गों से एकाधिक वंशानुक्रम